Алгоритмы кучи учебника включают способ исправления кучи, если вы знаете, что вся структура кучи правильная (a[n] < a[2*n+1] && a[n] < a[2*n+2]
, для всех n
в границах), за исключением того, что корень неправильный, в O (lg *) 1003 * n ) время. Когда вы heap.Pop()
элемент, он почти наверняка (*IntHeap).Swap
s первый и последний элементы, делает еще один обмен, чтобы сохранить инварианты кучи, а затем (*IntHeap).Pop
s элемент last . Это то, что вы видите здесь.
Вы также можете использовать это для реализации сортировки кучи . Скажем, у вас есть массив int[4]
, который вы пытаетесь отсортировать. Возьмите кусочек s int[] = (a, len=4, cap=4)
, затем:
- Если
len(s) == 1
, остановитесь.
- Своп
s[0]
и s[len(s)-1]
.
- Уменьшите ломтик на один элемент:
s = (array(s), len=len(s)-1, cap=cap(s))
.
- Если куча вышла из строя, исправьте ее.
- Перейти к 1.
Скажем, ваш пример начинается с [1, 2, 5, 3]. Тогда:
[1, 2, 5, 3]
[3, 2, 5, 1] Swap first and last
[3, 2, 5], 1 Shrink slice by one
[2, 3, 5], 1 Correct heap invariant
[5, 3, 2], 1 Swap first and last
[5, 3], 2, 1 Shrink slice by one
[3, 5], 2, 1 Correct heap invariant
[5, 3], 2, 1 Swap first and last
[5], 3, 2, 1 Shrink slice by one
5, 3, 2, 1 Sorted (descending order)