Pers.narod.ru. Алгоритмы. Объединение упорядоченных массивов |
Объединить 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.
|
|