算法导论第六章 堆排序总结

 

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(Ai)函数通过递归,从元素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-HEAPIFYMAX-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 14:00  SunnyDay2015  阅读(278)  评论(0编辑  收藏  举报