Сортировка Шелла
Это модификация сортировки вставками, когда сравниваются элементы, отстоящие на некотором уменьшающемся расстоянии, как в сортировке расчёской. Начальное расстояние берётся равным размеру массива и уменьшается вдвое для каждого следующего прохода, пока не уменьшится до 1. Последний проход - обычная сортировка вставками.
procedure ShellSort(var A: TAI); var step: integer; // Расчёска с произвольным шагом procedure Comb(step: integer); var i,j: integer; begin i := Low(A)+step; while i <= High(A) do begin j := i; while (j > Low(A)) and (A[j] < A[j-step]) do begin swap(A[j], A[j-step]); j := j - step; end; i := i + step; end; end; begin step := Length(A) -1; repeat Comb(step); step := step div 2; until step < 1; end;
Максимальная | O(N2) |
Минимальная | O(n(log n)2) |
Существуют другие варианты выбора шагов, которые существенно влияют на сложность:
- Последовательность Хиббарда: 2i - 1 ≤ N, i ∈ N
- Седжвика: di = 9 · 2i - 9 · 2i/2 + 1, для чётных i, di = 8 · 2i - 6 · 2(i+1)/2 + 1, для нечётных i
- Числа Фибоначчи
- Последовательность Пратта: 2i · 3j ≤ N/2, i,j ∈ N
- Эмпирическая последовательность Циура: d ∈ {1, 4, 10, 23, 57, 132, 301, 701, 1750}
Метки:
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии