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.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz