Проще взглянуть на кучу как на дерево:
1
3 9
7 5
, где каждый узел меньше, чем любой из его дочерних элементов, но порядок дочерних элементов не имеет значения (что отличает кучу от двоичнойдерево поиска).
Полное дерево допускает простое встраивание в массив путем нумерации узлов в порядке ширины, начиная с корня как узла 1.
1(1)
3(2) 9(3)
7(4) 5(5)
При такомвстраивание, имеют место следующие соотношения:
li[i] <= li[2*i]
li[i] <= li[2*i + 1]
2*i
и 2*i + 1
- формулы для вычислениялевый и правый дочерний, соответственно, узла в позиции i
:
+--+--+
| v v
[1, 3, 9, 7, 5]
| ^ ^
+-----+--+
(Вы можете указать эти свойства для массива на основе 0, но проще думать с массивами на основе 1.)
Такой список упорядочен в куче (что слабее, чем отсортированный , поскольку все отсортированные списки также упорядочены в куче), и допускает стандартную кучуметоды, которые будут реализованы эффективно.