Другие языки программирования и технологии

Сортировка Естественным слиянием одномерного массива

const
Kol = 20;
type
aType = array [1..Kol] of Integer;
const
Ish : aType =
(17, 31, 05, 59, 13, 41, 43, 76, 11, 23, 29, 47, 03, 07, 71, 02, 19, 57, 37, 61);
var
A, B, C : aType;
Nom, KolB, KolC, NomB, NomC : Integer;
NapravlenieB : Boolean; // True -> B // False -> C
Sorted : Boolean; // При сливании в один все ли элементы отсортированы?
begin
for Nom := 1 to Kol do A[Nom] := Ish[Nom];
WriteLn('Исходный массив: '); for Nom := 1 to Kol do Write(' ', A[Nom]); WriteLn;

repeat
// Рассортировываем по B и C
// Первый всегда в B
B[1] := A[1]; KolB := 1; NapravlenieB := True; KolC := 0;

for Nom := 2 to Kol do
begin
if A[Nom] < A[Nom - 1] then // Меняем направление
NapravlenieB := Not NapravlenieB;
if NapravlenieB then
begin
Inc(KolB);
B[KolB] := A[Nom];
end
else
begin
Inc(KolC);
C[KolC] := A[Nom];
end;
end;

WriteLn('Получили B:'); for Nom := 1 to KolB do Write(' ', B[Nom]); WriteLn;
WriteLn('Получили C:'); for Nom := 1 to KolC do Write(' ', C[Nom]); WriteLn;

for Nom := 1 to Kol do A[Nom] := 0;

// Сливаем всё обратно в A
Sorted := True; // Будем думать, что все будут отсортированы
Nom := 0; NomB := 1; NomC := 1;
repeat
Inc(Nom);
if B[NomB] < C[NomC] then
begin
A[Nom] := B[NomB];
Inc(NomB);
end
else
begin
A[Nom] := C[NomC];
Inc(NomC);
end;
if Sorted then if Nom > 1 then Sorted := (A[Nom] > A[Nom - 1]);
until (NomB > KolB) or (NomC > KolC);
// В одном из массивов всегда есть остаток
// А в каком не важно - всё равно с какого, но солъём
while NomB <= KolB do
begin
Inc(Nom);
A[Nom] := B[NomB];
Inc(NomB);
if Sorted then if Nom > 1 then Sorted := (A[Nom] > A[Nom - 1]);
end;
while NomC <= KolC do
begin
Inc(Nom);
A[Nom] := C[NomC];
Inc(NomC);
if Sorted then if Nom > 1 then Sorted := (A[Nom] > A[Nom - 1]);
end;

WriteLn('Получили A:'); for Nom := 1 to Kol do Write(' ', A[Nom]); WriteLn;
until Sorted;

WriteLn('Отсортированный массив: '); for Nom := 1 to Kol do Write(' ', A[Nom]); WriteLn;
end.
ГБ
Геннадий Брусьянин
61 077
Лучший ответ

Похожие вопросы