
- •31. Алгоритмы сортировки. Постановка задачи, классификация, анализ эффективности. Основные алгоритмы (обмен, выбор, вставка, шейкер, метод Шелла, быстрая, поразрядная, пирамидальная).
- •Сортировки обменами Алгоритм сортировки обменами (метод пузырька).
- •Алгоритм шейкер-сортировки.
- •Алгоритм сортировки выбором.
- •Алгоритм сортировки вставками.
- •Алгоритм сортировки Шелла
- •Алгоритм быстрой сортировки
- •Поразрядная сортировка
- •Пирамидальная сортировка
Алгоритм сортировки Шелла
Некоторое усовершенствование сортировки простыми вставками предложено Д.Шеллом в 1959 г. Основная идея алгоритма заключается в сортировке элементов массива, отстоящих друг от друга на расстоянии h. Этот процесс называется h-сортировкой. Каждая h-сортировка программируется как сортировка простыми вставками. Затем h уменьшается и повторяется сортировка заново. Процесс заканчивается, когда h уменьшается до 1. Не является устойчивой.
Таким образом, программа разрабатывается как сортировка элементов массива для приращений h1, h2,…ht с условиями ht=1, hi+1<hi. При анализе алгоритма Шелла выяснилось, что неизвестно, какая последовательность приращений дает лучшие результаты. Кнут рекомендовал последовательность 1, 4, 13, 40, 121,… (записанную в обратном порядке), где hk-1=3hk+1, ht=1, t=[log3 n]-1. Он же рекомендовал последовательность 1, 3, 7, 15, 31,…, где hk-1=2hk+1, ht=1, t=[log2 n]-1.
t - это номер последнего приращения. Его рассчитываем через логарифм от числа элементов массива исходного. ht =1. значит что последние массивы которые мы будем сортировать состоят из 1 элемента
Алгоритм быстрой сортировки
Алгоритм принадлежит Хоару (Charles Antony Richard Hoare), который опубликовал и тщательно проанализировал его в 1962 году. Суть алгоритма основана на обмене элементов с разделением, поэтому иногда его называют обменной сортировкой с разделением.
Выберем случайным образом какой-то элемент массива, обозначим его y и будем называть его опорным элементом. Наша задача разделить массив на две части – левую, с элементами <y и правую с элементами >y. Будем просматривать массив с двух сторон. Двигаясь слева направо, найдем элемент x[i]>y, а, двигаясь справа налево, x[j]<y. Поменяем их местами и продолжим просмотр до тех пор, пока не встретимся в каком-то месте массива. Понятно, что после такого прохода массив будет разделен по принципу: слева стоят все элементы меньшие опорного, а справа – все элементы большие или равные.Теперь тот же метод применим к левой и правой части, до тех пор, пока каждая часть не будет содержать только один элемент.
Procedure Quicksort(var x:vector);
Procedure sort(l,r: integer);
Var i, j: integer;
y, z: integer;
Begin
i:=l; j:=r;
y:=x[(l+r) div 2];
repeat
while x[i]<y do i:=i + 1;
while x[j]>y do j:=j - 1;
if i<=j then begin z:=x[i]; x[i]:=x[j]; x[j]:=z
i:=i+1; j:=j-1 end;
until i>j;
if l < j then sort (l, j);
if i < r then sort(i, r) end;
sort(1, n) end; {quicksort}
Еще один способ улучшения метода, заключается в использовании простых методов для разделенных подмассивов малой длины N. Например, при N = 9, рекомендуется исп-ть сортировку простой вставкой.
Алгоритм является самым полезным алгоритмом внутренней сортировки, так как требует мало памяти и опережает другие алгоритмы по среднему времени выполнения.
Характеристики алгоритма «быстрой сортировки» зависят от удачного выбора элемента Y для разбиения. В хорошем случае число сравнений C= N*log(N), M=(N/6)*log(N). Таким образом, быстрая сортировка эффективна лишь в среднем - время работы пропорционально N*log(N), в худшем случае она может работать очень медленно, N2. Быстрая сортировка не является устойчивой.