Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
19.04.2015
Размер:
432.96 Кб
Скачать

Алгоритм сортировки Шелла

Некоторое усовершенствование сортировки простыми вставками предложено Д.Шеллом в 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. Быстрая сортировка не является устойчивой.

Соседние файлы в папке Структуры и алгоритмы компьютерной обработки данных