10.4.2 堆排序

  何谓"堆"?

  若含n个元素的序列 {,,…,} 满足下列关系则称作"小顶堆" 或"大顶堆" 。"堆顶" 元素为序列中的"最小值"或"最大值"。
   

  例如,{12, 39, 20, 65, 47, 34, 98, 81, 73, 56}为"小顶堆";
     {98, 81, 34, 73, 56, 12, 20, 39, 65, 47}为"大顶堆"。

  若将上述数列视作为一个完全二叉树,则堆顶元素 即为二叉树的根结点, 分别为 的"左子树根"和"右子树根",如右图所示。

  利用堆的特性进行的排序方法即为"堆排序",其排序过程如下:

 假设待排关键字序列为: { 34, 39, 20, 65, 47, 12, 98, 73, 81, 56 }

 1)先将它调整为大顶堆:{ 98, 81, 34, 73, 56, 12, 20, 39, 65, 47 }

 
2)互换"堆顶"和待排序列中
     的最后的关键字:{ 47, 81, 34, 73, 56, 12, 20, 39, 65, 98 }

 3)在待排序列中舍去最大关键字,将其余部
     分重新调整为堆:{ 81, 73, 34, 65, 56, 12, 20, 39, 47 }
98

 4)重复2)和3)直至待排序列中只剩一个关键字为止。

  可见,堆排序的两个关键问题是:
  1) 如何将一个无序序列调整为堆?
  2)如何在互换堆顶之后重新调整为堆?

 


  "堆排序"也是一种选择类的排序方法,每一趟从记录的无序序列中选出一个关键字最大或最小的记录,和简单选择所不同的是,在第一趟选最大或最小关键字记录时先"建堆",从而减少之后选择次大或次小关键字等一系列记录时所需的比较和移动次数。