Но "идеологически" это что-то вроде
type Tree struct {
Left *Tree
Value int
Right *Tree
}
</font>
Для всех , кроме корневого узла
Обратите внимание! Это _не_ бинарное дерево поиска!

Мы будем представлять дерево в виде массива. Какие функции нам нужно определить для удобства работы?

Необходимые процедуры для работы с пирамидой в виде массива:
1 Parent(i): 2 return Floor((i - 1) / 2) 3 4 LeftChild(i): 5 return i * 2 + 1 6 7 RightChild(i): 8 return i * 2 + 2</font>
</font>
Эту процедуру можно повторять "снизу вверх", сортируя дерево </font>

Эта процедура предпологает, что левая и правая "под-пирамиды" действительно являются пирамидами!
1 Drown(Heap, i, size): // (Пирамида, индекс, ограничения на массив) 2 l := Left(i) 3 r := Right(i) 4 if l ≤ size and Heap[l] > Heap[r] // первая проверка - выход за пределы 5 largest := l 6 else 7 largest := i 8 if r ≤ size and Heap[r] > Heap[largest] 9 largest := r 10 if largest != i 11 Swap(Heap, i, largest) 12 Drown(Heap, largest, size) // рекурсияСправка про size : нужен только затем, чтобы не трогать отсортированную часть </font>
1 BuildHeap(Array): 2 for i := Floor((length(Array) - 1) / 2) downto 0 3 Drown(Array, i, size)</font>

Неотсортированный массив преобразовать в пирамиду.
Повторять, пока весь массив не будет отсортирован:
1 Heapsort(Array): 2 size := length(Array) 3 BuildHeap(Array) 4 for i := length(Array) - 1 downto 1 5 size := size - 1 6 Swap(Array, 0, i) 7 Drown(Array, 0, size)</pre> </font>
Пример¶
![]()
Чтобы суметь корркетно рассчитать сложность алгоритма и убедиться, что он работает, докажем его корректность.

Кратко
</font>
При функция относится к , если для некоторого
То есть растет не быстрее, чем
Правила использования:
В следующем блоке кода проводится конечное количество сравнений и операций, :
1 l := Left(i) 2 r := Right(i) 3 if l ≤ size and Heap[l] > Heap[r] // первая проверка - выход за пределы 4 largest := l 5 else 6 largest := i 7 if r ≤ size and Heap[r] > Heap[largest] 8 largest := r 9 if largest != i 10 Swap(Heap, i, largest)
После этого мы смещаемся на "один уровень" в глубину пирамиды и вызываем процедуру рекурсивно.
Для пирамиды размера глубина равна
В дереве максимум , минимум элементов при глубине k:
Сложность равна

</font>
Чуть более сложно. Мы будем опираться на логарифмическую сложность Drown и коичество операций на каждом слое дерева. Пирамида обходится "снизу вверх", т.е. от листьев.
Поэтому лежащие ниже под-пирамиды уже соответсвуют свойствам пирамиды, и нужен только один вызов Drown на пару.
Вопросы:
Ответы:
Итак, сложность:
Внутренняя сумма
А сложность
</font>
Складывается из сложности BuildHeap и произведения количества элементов в массиве на сложность Drown:
</font>