
- •3. Алгоритмы сортировки
- •3.1. Сортировка массивов
- •3.1.1. Сортировка простыми включениями
- •3.1.2. Сортировка бинарными включениями (модифицированная сортировка простыми включениями)
- •3.1.3. Сортировка простым выбором
- •3.1.4. Сортировка простым обменом (метод пузырька)
- •3.1.5. Метод предсортировки и слияния
- •3.1.6. Метод максимумов
- •3.1.7. Шейкер1-сортировка
- •3.1.8. Сортировка включениями с убывающим приращением (сортировка Шелла)
- •3.1.9. Сортировка с помощью дерева
- •3.1.10. Пирамидальная сортировка
- •3.1.11. Быстрая сортировка (метод Хоора)
- •3.1.12. Цифровая распределяющая сортировка
- •3.2. Сортировка последовательных файлов
- •3.2.1. Простое слияние
- •3.2.2. Естественное слияние
- •3.2.3. Сбалансированное многопутевое слияние
- •3.2.4. Многофазная сортировка
- •3.3. Анализ алгоритмов
- •2. Некоторые элементы находятся не на своём месте
- •1 3 4 5 2
- •5 4 3 2 1
3.1.10. Пирамидальная сортировка
Пирамида – двоичное дерево с упорядоченными листьями (корень дерева – наименьший элемент). Пирамиду можно представить в виде массива (смотри рис.3.6. ). Первый элемент пирамиды является наименьшим.
Рис. 3.6. Массив, расположенный в виде бинарного дерева
Просеивание – построение новой пирамиды: помещение нового элемента в вершину дерева, далее он перемещается («просеивается») по пути, на котором находятся меньшие по сравнению с ним элементы, которые одновременно поднимаются вверх.
Например, возьмём исходную пирамиду, показанную на рис. 3.7,а, и расширим эту пирамиду «влево», добавив элемент h1=44. Значение 44 сначала меняется местами с 06, затем с 12, и так формируется дерево, показанное на рис. 3.7,б.
Рис. 3.7 а) пирамида из семи элементов; б) просеивание элемента 44 через пирамиду.
Способ построения пирамиды, предложенный Р.У. Флойдом: пусть дан массив h1,…hn, тогда элементыhn/2+1…hnуже образуют пирамиду. Эти элементы составляют последовательность, которую можно рассматривать как нижний ряд соответствующего двоичного дерева (смотри рис. 3.8). Пирамида расширяется влево: на каждом шаге добавляется новый элемент и при помощи просеивания помещается на соответствующее место.
Рис. 3.8. Построение пирамиды
67 X1..Xn
06 h1
/ \ / \
42 12 h2h3
/ \ / \ / \ / \
55 94 18 44 h4h5h6h7
h1 (наименьшее число) записывается в отсортированный массив,Xзаписывается вh1и просеивается. Это повторяется, пока не закончатся свободные элементы. После этогоh1 записывается в отсортированный массив, а на его место записывается меньший элемент из следующего уровня, на место которого в свою очередь записывается меньший элемент следующего уровня этой ветви, и т.д. На место элемента из нижнего уровня записывается последний по счету элемент.
Пример пирамидальной сортировки представлен на рис. 3.9.
Рис. 3.9. Пример пирамидальной сортировки
3.1.11. Быстрая сортировка (метод Хоора)
Этот метод разработан К. Хоором в 1962 году.
Суть метода заключается в том, чтобы выбрать случайным образом какой-то элемент, просмотреть массив, двигаясь слева направо, пока не будет найден элемент, больший выбранного. Затем просмотреть его справа налево, пока не будет найден элемент, меньший выбранного. После этого поменять эти элементы местами и продолжить «просмотр с обменом», пока два просмотра не встретятся где-то в середине массива. В результате массив разделится на две части: левую – с меньшими элементами, чем выбранный, и правую – с большими элементами. Разделив массив, нужно сделать то же самое с обеими полученными частями, затем с частями этих частей и т.д., пока каждая часть не будет содержать только один элемент.
Пример первого разделения массива проиллюстрирован на рис. 3.10.
Рис. 3.10. Разделение
Преимущество: для сортировки уже разделенных небольших подмассивов легко применить какой-либо простой метод.
Недостаток: эффективность алгоритма быстрой сортировки определяется выбором случайного начального элемента.