
Лекции - Структуры и алгоритмы компьютерной обработки данных / 7.Сортировка подсчетом. Цифровая сортировка. Порядковые статистики. Внешняя сортировка
.docСортировка подсчетом
Если ключ сортировки принимает целые значения в интервале 1 … K, и K достаточно мало (чтобы в память помещался вспомогательный массив длины K), то можно использовать устойчивый алгоритм сортировки подсчетом, имеющий сложность Ө(n).
Идея алгоритма - подсчитать для каждого элемента x, сколько элементов выходной последовательности меньше x, после чего записать x в выходной массив на нужное место.
Процедура сортировки подсчетом
А[1..N]-исходный массив, B[1..N]- выходной, С[1..K] -вспомогательный.
procedure CountSort;
Var I: integer;
Begin
For I:=1 to k do C[I]:=0;
For I:=1 to length(A) do Inc(C[A[I].key]);
{C[I] - количество элементов с ключом I}
For I:=2 to k do C[I]:=C[I]+C[I-1];
{C[I] - количество элементов с ключом <=I}
for I:=length(A) downto 1 do
begin
B[C[A[I].key]]:=A[I];
Dec(C[A[I].key]);
End;
End;
Цифровая сортировка
Используется, например, при сортировке дат – сначала по дням, потом - по месяцам, затем – по годам.
Предположим, что элементы последовательности состоят из d цифр.
Тогда можно отсортировать массив устойчивым алгоритмом сначала по 1 цифре, потом по второй и т.д. Сложность будет Ө(dn).
Порядковые статистики
Дано множество из n чисел. Найти элемент, который будет i-м по счету, если расположить элементы множества в порядке возрастания. Такой элемент называется i-й порядковой статистикой.
Примеры: минимум – порядковая статистика номер 1,
максимум – порядковая статистика номер n,
медиана - порядковая статистика номер (n+1)/2.
Поиск порядковой статистики за Ө (n) в среднем
Алгоритм аналогичен алгоритму быстрой сортировки. Разница – после разбиения массива обрабатывается только одна из частей (содержащая искомый элемент).
function select (var A:DataSet;p,r,i: integer):integer;
Var q,k: integer;
begin
if p=r then select:=A[p]
else
begin
q := partition(A,p,r);
k := q - p+1;
if i<=k
then select := select(A,p,q,i)
else select := select(A,q+1,r,i-k)
end;
end;
Алгоритмы внешней сортировки
Чаще всего используют метод слияния. Серия – отрезок последовательности, для которого выполняется свойство упорядоченности.
Серии распределяются на два или несколько вспомогательных файлов, затем они сливаются.
Основные характеристики сортировки слиянием:
-
количество вспомогательных файлов (если два файла – двухпутевое, если больше - многопутевое слияние)
-
Количество фаз (проходов по файлу). В двухфазовой сортировке отдельно реализуются фазы распределения и слияния. В однофазной сортировке эти действия объединяются вместе. Во время слияния элементы сразу же распределяются по вспомогательным файлам. Обычно однофазная сортировка быстрее, но требует большее количество файлов.
Идеи некоторых алгоритмов внешней сортировки
-
Простое слияние – размер серии фиксирован. Сначала берем по одному элементу, затем – по два и т.д.
-
Естественное слияние – объединяются серии максимальной длины.
Есть более сложные методы – многофазная сортировка, каскадная сортировка.