Консультация № 173044
08.10.2009, 09:48
0.00 руб.
0 2 1
Требуется объединить два упорядоченных по возрастанию массива A и B одного размера N (N – заданное натуральное число) в один массив размером 2N также упорядоченный, по возрастанию или убыванию по запросу.

Обсуждение

Неизвестный
08.10.2009, 11:34
общий
это ответ
Здравствуйте, Глазырин Александр.
Можете посмотреть различные сортировки по этому адресу http://www.cyberforum.ru/pascal/thread33243.html
Ваш вопрос под заголовком { Объединение двух массивов для сортировки слиянием }

Приложение:
{ Объединение двух массивов для сортировки слиянием }
procedure Merge( var A, P : mas; l, m, r : Integer );
var
i, j, k, z : Integer;
A2 : mas;
begin
z := r - l + 1;
i := l;
j := m;
k := 1;
{ Пока на "слили" все элементы от l до r }
while k <= z do
begin
{ Элемент из первого массива меньше или
во втором массиве закончились элементы }
if (j > r) or ((i < m) and (A[i] < A[j])) then
begin
A2[k] := A[i];
i := i + 1;
end
{ Элемент из второго массива меньше или
в первом массиве закончились элементы }
else
begin
A2[k] := A[j];
j := j + 1;
end;
k := k + 1;
end;
i := l;
{ Копируем слитые элементы обратно в массив A }
for k := 1 to z do
begin
A[i] := A2[k];
i := i + 1;
end;
end;

Неизвестный
08.10.2009, 11:53
общий
Если просто нужно объеденить массивы, то можно и вот так сделать:
SourceA,SourceB - исходные массивы
Target - массив с результатом
N - размерность массивов
Direct - если TRUE, то резльтирующий массив перевернут на убывание
Код:
var
I,Num: integer;
begin
SetLength(Target,2*N);
if (SourceA[N-1]<SourceB[0])then
begin // Если первый массив меньше второго
for I := 0 to N-1 do
Target[I]:= SourceA[I];
for I := N to 2*N-1 do
Target[I]:= SourceB[I-N];
end else begin // Если второй масив меньше первого
for I := 0 to N-1 do
Target[I]:= SourceB[I];
for I := N to 2*N-1 do
Target[I]:= SourceA[I-N];
end;
if not Direct then // Если нужно перевернуть массив
for I := 0 to N-1 do
begin
Num := Target[2*N-1-I];
Target[2*N-1-I]:= Target[I];
Target[I] := Num;
end;
Форма ответа