Пирамидальная сортировка

Материал из testwiki
Перейти к навигации Перейти к поиску
Анимированная схема алгоритма

Пирамидальная сортировка (Шаблон:Lang-en, «Сортировка кучей»[1]) — алгоритм сортировки, работающий в худшем, в среднем и в лучшем случае (то есть гарантированно) за O(nlogn) операций при сортировке n элементов.[2] Алгоритм работает «на месте» — количество задействованной служебной памяти O(1), то есть фиксированное[1].

Может рассматриваться как усовершенствованная сортировка пузырьком, в которой элемент всплывает (min-heap) / тонет (max-heap) по многим путям.

Пирамидальная сортировка была предложена Шаблон:Iw в 1963 году.[1]

Алгоритм

Пример сортирующего дерева
структура хранения данных сортирующего дерева

Сортировка пирамидой использует бинарное сортирующее дерево. Сортирующее дерево — это такое дерево, у которого выполнены условия:

  1. Каждый лист имеет глубину либо d, либо d1, d — максимальная глубина дерева.
  2. Значение в любой вершине не меньше (другой вариант — не больше) значения её потомков.

Удобная структура данных для сортирующего дерева — такой массив a, что a[0] - элемент в корне, а потомки элемента a[i] являются a[2i+1] и a[2i+2].

Алгоритм сортировки будет состоять из двух основных шагов:

1. Выстраиваем элементы массива в виде сортирующего дереваШаблон:Нет АИ:

a[i]a[2i+1]
a[i]a[2i+2]
при 0i<n/2.
Этот шаг требует O(nlogn) операций.

2. Будем удалять элементы из корня по одному за раз и перестраивать дерево. То есть на первом шаге обмениваем a[0] и a[n1], преобразовываем a[0],a[1], ...,a[n2] в сортирующее дерево. Затем переставляем a[0] и a[n2], преобразовываем a[0],a[1], ...,a[n3] в сортирующее дерево. Процесс продолжается до тех пор, пока в сортирующем дереве не останется один элемент. Тогда a[0],a[1], ...,a[n1] - упорядоченная последовательность.

Этот шаг требует O(nlogn) операций.

Достоинства и недостатки

Достоинства:

  • Имеет доказанную оценку худшего случая O(nlogn).
  • Сортирует на месте, то есть требует всего O(1) дополнительной памяти (если дерево организовывать так, как показано выше).

Недостатки:

Сортировка слиянием при расходе памяти O(n) быстрее (O(nlogn) с меньшей константой) и не подвержена деградации на неудачных данных.

Из-за сложности алгоритма выигрыш получается только на больших n. На небольших n (до нескольких тысяч) быстрее сортировка Шелла.

Применение

Пирамидальная сортировка активно применяется в ядре Linux[3].

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Wikibooks

Шаблон:Алгоритмы сортировки