6.1 堆

伪代码 过程 PARENT(i)
//父节点的下标
PARENT(i)
return ⌊i/2⌋
伪代码 过程 LEFT(i)
//左孩子的下标
LEFT(i)
return 2i
伪代码 过程 RIGHT(i)
//右孩子的下标
RIGHT(i)
return 2i+1

6.2 维护堆的性质

伪代码 过程 MAX-HEAPIFY(A,i)
//维护最大堆性质的重要过程
//最大堆性质:A[PARENT(i)] ≥ A[i]
MAX-HEAPIFY(A,i)
  l = LEFT(i)
  r = RIGHT(i)
  if l ≤ A.heap-size and A[l] > A[i]
    largest = l
  else largest = i
  if r ≤ A.heap-size and A[r] > A[largest]
    largest = r
  if largest ≠ i
    exchange A[i] with A[largest]
    MAX-HEAPIFY(A,largest)
MAX-HEAPIFY的执行过程

alt

alt alt

6.3 建堆

伪代码 过程 BUILD-MAX-HEAPIFY(A,i)
//对树中的其他结点都调用一次MAX-HEAPIFY
BUILD-MAX-HEAPIFY(A,i)
  A.heap-size = A.length
  for i = ⌊A.length/2⌋ downto 1
     MAX-HEAPIFY(A,i)
例子

alt alt

6.3-3

alt

Solution

从6.1-7中,我我们知道堆的叶子是由alt 索引的节点。 alt alt

因此,我们有

alt

这意味着它适用于h。