A[2i]、A[2i+1]是A[i]的孩子
==>若2i<=n&&2i+1<=n,则A[i]有孩子
==>若2i>n,则A[i]是叶子
==>the leaves are the nodes indexed by ?n/2 ? + 1, ?n/2 ? + 2, . . . , n
MIN-HEAPIFY(A, i)
1 l <- LEFT(i)
2 r <- RIGHT(i)
3 if l <= heap-size[A] and A[l] < A[i]
4 then smallest <- l
5 else smallest <- i
6 if r <= heap-size[A] and A[r] < [smallest]
7 then smallest <- r
8 if smallest != i
9 then exchange A[i] <-> A[smallest]
10 MIN_HEAPIFY(A, smallest)
void Heap::Max_Heapify(int i)
{
int l = (LEFT(i)), r = (RIGHT(i)), largest;
//选择i、i的左、i的右三个结点中值最大的结点
if(l <= heap_size && A[l] > A[i])
largest = l;
else largest = i;
if(r <= heap_size && A[r] > A[largest])
largest = r;
//如果根最大,已经满足堆的条件,函数停止
//否则
while(largest != i)
{
//根与值最大的结点交互
swap(A[i], A[largest]);
//交换可能破坏子树的堆,重新调整子树
i = largest;
l = (LEFT(i)), r = (RIGHT(i));
//选择i、i的左、i的右三个结点中值最大的结点
if(l <= heap_size && A[l] > A[i])
largest = l;
else largest = i;
if(r <= heap_size && A[r] > A[largest])
largest = r;
}
}
A = {5,3,17,10,84,19,6,22,9}
A = {5,3,17,22,84,19,6,10,9}
A = {5,3,19,22,84,17,6,10,9}
A = {5,84,19,22,3,17,6,10,9}
A = {84,5,19,22,3,17,6,10,9}
A = {84,22,19,5,3,17,6,10,9}
A = {84,22,19,10,3,17,6,5,9}