Меню
Главная
Случайная статья
Настройки
|
Пирамидальная сортировка (англ. Heapsort, «Сортировка кучей»[1]) — алгоритм сортировки, работающий в худшем, в среднем и в лучшем случае (то есть гарантированно) за операций при сортировке элементов.[2] Количество применяемой служебной памяти не зависит от размера массива (то есть, ).
Может рассматриваться как усовершенствованная сортировка пузырьком, в которой элемент всплывает (min-heap) / тонет (max-heap) по многим путям.
Содержание
История создания
Пирамидальная сортировка была предложена Дж. Уильямсом[англ.] в 1964 году.[1]
Алгоритм
Сортировка пирамидой использует бинарное сортирующее дерево.
Сортирующее дерево — это такое дерево, у которого выполнены условия:
- Каждый лист имеет глубину либо , либо , — максимальная глубина дерева.
- Значение в любой вершине не меньше (другой вариант — не больше) значения её потомков.
Удобная структура данных для сортирующего дерева — такой массив Array , что Array[0] — элемент в корне, а потомки элемента Array[i] являются Array[2i+1] и Array[2i+2] .
Алгоритм сортировки будет состоять из двух основных шагов:
1. Выстраиваем элементы массива в виде сортирующего дерева[источник не указан 3279 дней]:
при .
Этот шаг требует операций.
2. Будем удалять элементы из корня по одному за раз и перестраивать дерево. То есть на первом шаге обмениваем Array[0] и Array[n-1] , преобразовываем Array[0] , Array[1] , … , Array[n-2] в сортирующее дерево. Затем переставляем Array[0] и Array[n-2] , преобразовываем Array[0] , Array[1] , … , Array[n-3] в сортирующее дерево. Процесс продолжается до тех пор, пока в сортирующем дереве не останется один элемент. Тогда Array[0] , Array[1] , … , Array[n-1] — упорядоченная последовательность.
Этот шаг требует операций.
Достоинства и недостатки
Достоинства
- Имеет доказанную оценку худшего случая .
- Сортирует на месте, то есть требует всего дополнительной памяти (если дерево организовывать так, как показано выше).
Недостатки
- Неустойчив — для обеспечения устойчивости нужно расширять ключ.
- На почти отсортированных массивах работает столь же долго, как и на хаотических данных.
- На одном шаге выборку приходится делать хаотично по всей длине массива — поэтому алгоритм плохо сочетается с кэшированием и подкачкой памяти.
- Методу требуется доступ к произвольному элементу структуры; не работает на связанных списках и других структурах памяти последовательного доступа.
- Не распараллеливается.
Сортировка слиянием при расходе памяти быстрее ( с меньшей константой) и не подвержена деградации на неудачных данных.
Из-за сложности алгоритма выигрыш получается только на больших . На небольших (до нескольких тысяч) быстрее сортировка Шелла.
Применение
Алгоритм «пирамидальная сортировка» активно применяется в ядре Linux.
Примечания
- 1 2 Курс лекций «Современные технологии параллельного программирования», Лекция № 5: Пирамидальная сортировка . Дата обращения: 20 марта 2009. Архивировано из оригинала 15 марта 2009 года.
- ScienceDirect — Journal of Algorithms : The Analysis of Heapsort . Дата обращения: 30 сентября 2017. Архивировано 4 июня 2012 года.
Литература
Ссылки
|
|