Nickolay.info. Алгоритмы. Объединение упорядоченных массивов |
Объединить 2 упорядоченных по возрастанию (или неубыванию) массива в третий массив, также упорядоченный.
Неопытные люди начинают решать задачу с несколькими циклами обработки, меж тем, вполне достаточно одного.
Идея алгоритма очень проста - завести для каждого из трех массивов A,B (исходные) и C (объединённый) собственные счётчики элементов. Обозначим их ia, ib и ic соответственно. Потом, сравнивая A[ia] с B[ib] писать в C[ic] тот элемент, который меньше. Не забыть о проверке выхода за границы массива.
{ Объединить 2 упорядоченных по возрастанию массива } program m_concat; const Size=10; {Максимльная размерность массивов} Step=5; {Случайный шаг для генерации элементов - следующий элемент больше предыдущего не более, чем на это значение} var a,b:array [1..Size] of integer; c:array [1..2*Size] of integer; i,n1,n2,ia,ib,ic:integer; begin writeln; {Блок ввода размерности 1 массива} repeat write('Введите размерность 1 массива (от 2 до ',Size,'):'); {$I-}read (n1);{$I+} until (n1>1) and (n1<=Size); Randomize; a[1]:=Random(Step); write ('A= ',a[1],' '); for i:=2 to n1 do begin a[i]:=a[i-1]+Random(Step); write (a[i],' '); end; writeln; {Такой же блок для 2 массива, для простоты нет подпрограммы} repeat write('Введите размерность 2 массива (от 2 до ',Size,'):'); {$I-}read (n2);{$I+} until (n2>1) and (n2<=Size); b[1]:=Random(Step); write ('B= ',b[1],' '); for i:=2 to n2 do begin b[i]:=b[i-1]+Random(Step); write (b[i],' '); end; writeln; {Обработка} ia:=1; ib:=1; write ('C= '); for ic:=1 to n1+n2 do begin {Добавить в массив C тот элемент, который меньше} if a[ia]<=b[ib] then begin c[ic]:=a[ia]; if ia<n1 then Inc(ia) else begin a[n1]:=b[ib]; if ib<n2 then Inc (ib); end; end else begin c[ic]:=b[ib]; if ib<n2 then Inc(ib) else begin b[n2]:=a[ia]; if ia<n1 then Inc(ia); end; end; write (c[ic],' '); end; writeln; write ('Press ENTER to exit'); reset (input); readln; end.
![]() |