Сортировка слияниям принадлежит к классу алгоритмов O(N logN) и не имеет
худших случаев. Она более наглядна, чем быстрая сортировка. При сортировке
используется алгоритм двухпутевого слияния, который мы сейчас
рассмотрим. Допустим, у нас есть два отсортированных массива, а нам
надо создать массив, содержащий все элементы первого и второго массива
в отсортированном виде. Можно скопировать элементы обоих массивов
в новый и применить алгоритм сортировки, но при таком подходе мы не
используем то, что массивы отсортированы. Есть решение за линейное
время, и оно достаточно простое. Надо сравнивать элементы в вершинах
массивов и больший (если Вы сортируете по невозростанию) перемещать
в результирующий массив пока один из массивов не опустеет. После этого
все элементы из непустого массива надо добавить к результирующему.
Повторюсь, алгоритм достаточно прост и наверняка Вы встречались с
ним в жизни.
Сортировка слиянием делит исходный массив на две части. Затем они
рекурсивно сортируются и сливаются. Как и в случае с быстрой сортировкой
большинство рекурсивных вызовов приходится на маленькие списки.
Гораздо эффективнее сортировать их вставками.
procedure MergeSort(_L,_R:integer);
var
m,i,j,k,c:integer;
beginif _R-_L<16 then// для маленьких массивов begin
InsertionSort(_L,_R); // сортировка вставками
exit;
end; m:=(_L+_R) div 2;
if _L<m then
MergeSort(_L,m);
if _R>m+1 then
MergeSort(m+1,_R);
//Слияние двух отсортированных массивов
i:=_L;
j:=m+1;
c:=_L;
while (i<=m)and(j<=_R) dobeginif a[i]>a[j] thenbegin
b[c]:=a[j];
inc(j);
endelsebegin
b[c]:=a[i];
inc(i);
end;
inc(c);
end;
if m>=i then
System.Move(a[i],b[c],SizeOf(a[0])*(m-i+1))
else System.Move(a[j],b[c],SizeOf(a[0])*(_R-j+1));
//Перемещаем получившийся массив
System.Move(b[_L],a[_L],SizeOf(a[0])*(_R-_L+1));
end;
Если необходимо, то копировать массивы можно и поэлементно.
В общем случае сортировка слияниям медленнее быстрой сортировки
и чуть быстрее пирамидальной. При этом ей требуется дополнительная
память пропорциональная N. Конечно, можно реализовать этот алгоритм
так, что он будет требовать в 2 раза меньше памяти, но я это делать
не стану.
Сортировка слияниям используется для сортировки больших массивов не
помищающихся в память.