Существует много реализаций структуры данных кучи, но речь идет об определенной c неявной двоичной куче . Сортировка кучи выполняется на месте, поэтому она использует этот дизайн. Для двоичных кучи требуется двоичное дерево , поэтому оно может быть представлено в виде неявной структуры, построенной из массива: для каждого A[n]
в массиве с нулями
A[0]
- корень; если n != 0
, A[floor((n-1)/2)]
- родительский элемент; - , если
2n+1
находится в диапазоне массива, то A[2n+1]
- левый дочерний элемент, или же это листовой узел; - если
2n+2
находится в диапазоне массива, то A[2n+2]
является правильным потомком.
Скажем, что массив, [10,14,19,21,23,31]
, неявно представлен гомоморфизмом, используя приведенные выше правила, как,
Это не соответствует инвариантам max-heap, поэтому необходимо heapify
, возможно, используя Конструкция кучи Флойда , которая использует sift down
и работает в O(n)
. Теперь у вас есть куча и отсортированный массив без длины, ([31,23,19,21,14,10],[])
(это все неявно, поскольку куча не требует дополнительной памяти, это просто массив в памяти.) Визуализация кучи на этом этапе,
Мы выскакиваем из максимального элемента кучи и используем sift up
, чтобы восстановить форму кучи. Теперь куча на один меньше, и мы взяли максимальный элемент и сохранили его в нашем массиве без смещения, ([23,21,19,10,14],[31])
,
повтор, ([21,14,19,10],[23,31])
,
([19,14,10],[21,23,31])
,
([14,10],[19,21,23,31])
,
([10],[14,19,21,23,31])
,
Размер кучи равен единице, поэтому последний отсортированный массив - [10,14,19,21,23,31]
. Если использовать минимальную кучу и тот же алгоритм, массив будет отсортирован в другом направлении.