Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы сортировки данных.doc
Скачиваний:
1
Добавлен:
29.06.2024
Размер:
429.57 Кб
Скачать

1.1.1.5Метод Шелла

Этот широко используемый метод, предложенный Д.Л. Шеллом в 1959 г., минимален по памяти и обеспечивает высокую скорость сортировки. Метод использует сравнения и перестановки элементов, как и метод вставок, однако в отличие от последнего в срав­нении участвуют не соседние элементы, а отстоящие друг от друга на определенном расстоянии. При необходимости перестановки элементы перемещаются скачком на это же расстояний, а не на одну позицию, как в методе вставок.

Для проведения сортировки описываемым методом последователь­ность из N элементов делится на N/2 групп или на (N - 1) /2, если N не­четно. Каждая группа содержит по два элемента. Если число элементов нечетно, то одна часть будет содержать три элемента. Элементы, принад­лежащие одной группе, отстоят Ha N/2 позиций. Это расстояние называют шагом. В течение первого прохода осуществляется упорядочивание элемен­тов каждой группы методом вставок.

Для осуществления каждого следующего прохода Шелл предло­жил устанавливать шаг, равный половине предыдущего шага (у дробных чисел берется целая часть). Для последнего прохода устанавливается шаг, равный 1, и упорядочи­вается единственная группа. В результате попарных сравнений и обменов исходная последовательность оказывается полностью упорядоченной.

Для сортировки последовательности из N элементов требуется около log2N проходов.

Число сравнений, необходимое для сортировки методом Шелла, существенно зависит от шага. До сих пор продолжает обсуждаться вопрос о том, как следует выбирать последовательность шагов. Самим Шеллом была предложена последовательность N/2, N/4, N/8 и т.д.

До настоящего времени не определена общая формула для расчета среднего числа сравнений. Приближенную оценку числа сравнений про­изводят по формуле N log2 N.

Алгоритм метода Шелла приведен ниже:

list – сортируемый список элементов

N – число элементов в списке

step = N/2

for step = N/2 to 1 do

ElemCount = N/step

GroupCount = N/ElemCount

for i=1 to GroupCount do

for j=1 to ElemCount do

NewElement = list[i+j*step]

location = i+(j-1)*step

while(location >= i and NewElement < list[location]) do

list[location+step] = list[location]

end while

list[location+step] = NewElement

end for

end for

step = step/2

end while

1.1.1.6Быстрая сортировка

Быстрая сортировка (англ. quicksort), часто называемая qsort по имени реализации в стандартной библиотеке языка Си — широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром в 1960 году. Один из быстрых известных универсальных алгоритмов сортировки массивов (в среднем O(n log n) обменов при упорядочении n элементов), хотя и имеющий ряд недостатков.

1.1.1.6.1Краткое описание алгоритма

1. выбрать элемент, называемый опорным.

2. сравнить все остальные элементы с опорным, на основании сравнения разбить множество на три — «меньшие опорного», «равные» и «большие», расположить их в порядке меньшие-равные-большие.

3. повторить рекурсивно для «меньших» и «больших».

Примечание: на практике обычно разделяют сортируемое множество не на три, а на две части: например, «меньшие опорного» и «равные и большие». Такой подход в общем случае оказывается эффективнее, так как для осуществления такого разделения достаточно одного прохода по сортируемому множеству и однократного обмена лишь некоторых выбранных элементов.