算法导论第六章 堆排序总结
MAX-HEAPIFY(A, i)
1 l ← LEFT(i)
2 r ← RIGHT(i)
3 if l ≤ heap-size[A] and A[l] > A[i]
4 then largest ← l
5 else largest ← i
6 if r ≤ heap-size[A] and A[r] > A[largest]
7 then largest ← r
8 if largest ≠ i
9 then exchange A[i] ↔ A[largest]
10 MAX-HEAPIFY(A, largest)
BUILD-MAX-HEAP(A)
1 heap-size[A] ← length[A]
2 for i ← length[A]/2 downto 1
3 do MAX-HEAPIFY(A, i)
HEAPSORT(A)
1 BUILD-MAX-HEAP(A)
2 for i ← length[A] downto 2
3 do exchange A[1] ↔ A[i]
4 heap-size[A] ← heap-size[A] - 1
5 MAX-HEAPIFY(A, 1)
MAX-HEAPIFY(A,i)函数通过递归,从元素A[i]开始与A[i]的两个子节点比较,将二者中的较大者与A[i]数值对换,如果A[i]比两个子节点数值皆大,则不执行任何操作,并向下一级继续执行MAX-HEAPIFY,即递归调用。当最后一级执行完毕时,MAX-HEAPIFY也就结束了。MAX-HEAPIFY的作用就是在执行BUILD-MAX-HEAP(A)后,将 以A[i]为子树的堆中的最大值移动到A[i]的位置,即这个子树的根节点。BUILD-MAX-HEAP(A)一定要在MAX-HEAPIFY之前执行,BUILD-MAX-HEAP(A)的作用就是从堆的倒数第二层的最后一个元素开始到堆的顶端位置,循环地调用MAX-HEAPIFY,以实现将堆中最大的元素移动到堆的顶端。MAX-HEAPIFY和MAX-HEAPIFY是局部与整体的关系,又是被调用与调用的关系,MAX-HEAPIFY完成的是局部的对较大元素向堆顶方向的移动,而MAX-HEAPIFY同过不断调用MAX-HEAPIFY,实现了整个堆的将较大元素向堆顶方向的移动。每执行一次MAX-HEAPIFY,堆中最大元素一定移动到堆顶。
HEAPSORT(A)
1 BUILD-MAX-HEAP(A) //实现 级数大的元素比级数小的元素数值小 这样的趋势,
//只是趋势未必是一定的
2 for i ← length[A] downto 2
3 do exchange A[1] ↔ A[i] //将堆顶最大元素与堆中最后一级最后一个
//元素的位置交换。
4 heap-size[A] ← heap-size[A] - 1
5 MAX-HEAPIFY(A, 1) //由于exchange,此时堆顶元素是原堆的最后一级上的较小元
//素,而我们要的是一个整个堆的最大元素,所以要重新建堆。
//由于之前已经执行过BUILD-MAX-HEAP,也就是说已经实现
//“级数大的元素一定比级数小的元素数值小”,所以不需
//要在执行一次BUILD-MAX-HEAP,只需执行MAX-HEAPIFY即可。