- •1.1Алгоритмы сортировки данных
- •1.1.1Методы внутренней сортировки
- •1.1.1.1Метод выбора
- •1.1.1.2Метод обмена
- •1.1.1.3Сортировка вставками
- •1.1.1.4Метод подсчета
- •1.1.1.5Метод Шелла
- •1.1.1.6Быстрая сортировка
- •1.1.1.6.1Краткое описание алгоритма
- •1.1.1.6.2Алгоритм
- •1.1.1.6.3Оценка эффективности
- •1.1.1.6.4Улучшения
- •1.1.1.6.5Достоинства и недостатки
- •1.1.1.7Пирамидальная сортировка
- •1.1.1.7.1Понятие пирамиды
- •1.1.1.7.2Просеивание вверх
- •1.1.1.7.3Просеивание вниз
- •1.1.1.7.4Построение пирамиды
- •1.1.1.8Сортировка слиянием
- •1.1.1.8.1Процедура слияния
- •1.1.1.8.2Сортировка слиянием
- •1.1.2Методы внешней сортировки
- •1.1.2.1Сбалансированное n-ленточное слияние
- •1.1.3Факторы, учитываемые при выборе метода сортировки.
- •2Размещение данных, основанное на преобразовании кода записи в ее адрес
- •2.1Хеширование данных
- •2.2Методы разрешения коллизий
- •2.3Переполнение таблицы и рехеширование
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. повторить рекурсивно для «меньших» и «больших».
Примечание: на практике обычно разделяют сортируемое множество не на три, а на две части: например, «меньшие опорного» и «равные и большие». Такой подход в общем случае оказывается эффективнее, так как для осуществления такого разделения достаточно одного прохода по сортируемому множеству и однократного обмена лишь некоторых выбранных элементов.
