- Пирамидальная сортировка
-
Пирамидальная сортировка (англ. Heapsort, «Сортировка кучей»[1]) — алгоритм сортировки, работающий в худшем, в среднем и в лучшем случае (то есть гарантированно) за Θ(n log n) операций при сортировке n элементов.[2] Количество применяемой служебной памяти не зависит от размера массива (то есть, O(1)).
Может рассматриваться как усовершенствованная сортировка пузырьком, в которой элемент всплывает (min-heap) / тонет (max-heap) по многим путям.
Содержание
История создания
Этот раздел не завершён. Вы поможете проекту, исправив и дополнив его.Пирамидальная сортировка была предложена Дж. Уильямсом в 1964 году.[1]
Алгоритм
Сортировка пирамидой использует сортирующее дерево. Сортирующее дерево — это такое двоичное дерево, у которого выполнены условия:
- Каждый лист имеет глубину либо
, либо
,
— максимальная глубина дерева. - Значение в любой вершине не меньше (другой вариант — не больше) значения её потомков.
Удобная структура данных для сортирующего дерева — такой массив
Array, чтоArray[1]— элемент в корне, а потомки элементаArray[i]—Array[2i]иArray[2i+1].Алгоритм сортировки будет состоять из двух основных шагов:
1. Выстраиваем элементы массива в виде сортирующего дерева:
![Array[i]\geq Array[2i]](0c195b642477785e6de79e2c936db87a.png)
![Array[i]\geq Array[2i+1]](29226cd812334a62639271af0ef5837b.png)
при
.Этот шаг требует
операций.2. Будем удалять элементы из корня по одному за раз и перестраивать дерево. То есть на первом шаге обмениваем
Array[1]иArray[n], преобразовываемArray[1],Array[2], … ,Array[n-1]в сортирующее дерево. Затем переставляемArray[1]иArray[n-1], преобразовываемArray[1],Array[2], … ,Array[n-2]в сортирующее дерево. Процесс продолжается до тех пор, пока в сортирующем дереве не останется один элемент. ТогдаArray[1],Array[2], … ,Array[n]— упорядоченная последовательность.Этот шаг требует
операций.Достоинства и недостатки
Достоинства
- Имеет доказанную оценку худшего случая
. - Сортирует на месте, то есть требует всего O(1) дополнительной памяти (если дерево организовывать так, как показано выше).
Недостатки
- Сложен в реализации.
- Неустойчив — для обеспечения устойчивости нужно расширять ключ.
- На почти отсортированных массивах работает столь же долго, как и на хаотических данных.
- На одном шаге выборку приходится делать хаотично по всей длине массива — поэтому алгоритм плохо сочетается с кэшированием и подкачкой памяти.
- Не работает на связанных списках и других структурах памяти последовательного доступа.
Сортировка слиянием при расходе памяти O(n) быстрее (
с меньшей константой) и не подвержена деградации на неудачных данных.Из-за сложности алгоритма выигрыш получается только на больших n. На небольших n (до нескольких тысяч) быстрее сортировка Шелла.
Примечания
Литература
- Ананий В. Левитин Глава 6. Метод преобразования: Пирамиды и пирамидальная сортировка // Алгоритмы: введение в разработку и анализ = Introduction to The Design and Analysis of Aigorithms. — М.: «Вильямс», 2006. — С. 275-284. — ISBN 5-8459-0987-2
- Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 6. Пирамидальная сортировка // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — С. 182-188. — ISBN 5-8459-0857-4
Ссылки
- Пирамидальная сортировка — подробное описание с иллюстрациями и примером реализации на C++. Приведён вывод оценок скорости работы алгоритма и измерение времени работы на реальной вычислительной системе.
- Сортировка с помощью кучи (пирамидальная сортировка) — доходчивое описание с иллюстрациями и примером реализации на Pascal.
Алгоритмы сортировки Теория Сложность • О-нотация • Отношение порядка • Типы сортировки: Устойчивая • Внутренняя • Внешняя
Алгоритмы Обменные: Пузырьком • Перемешиванием • Гномья • Быстрая • Расчёской • Выбором: Выбором • Пирамидальная • Вставками: Вставками • Шелла • Деревом • Слиянием: Слиянием • Без дополнительной памяти • Без сравнений: Подсчётом • Поразрядная • Блочная • Гибридные: Introsort • Timsort • Прочее: Топологическая • Сети • Непрактичные: Bogosort • Stooge sort • Глупая • Блинная
Категория:- Алгоритмы сортировки
- Каждый лист имеет глубину либо
Wikimedia Foundation. 2010.
