堆排序总结

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即可。

posted @ 2011-02-14 20:47  SunnyDay2015  阅读(297)  评论(0编辑  收藏  举报