1.思想
1.1 二叉堆
二叉堆满足两个特性:
1)父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值;
2)每个结点的左子树和右子树都是一个二叉堆
当父结点的键值总是大于或等于任何一个子结点的键值时为最大堆;反之为最小堆。
下图是一个最小堆的示意图:
1.2 堆的调整
以最小堆为例,从根结点开始,先在左右孩子结点中找最小的,如果父结点比这个最小的还小说明不需要调整了,反之将父结点和它交换后再对后面的结点进行相同的操作。
1.3 堆的建立
将堆中所有数据重新排序,使其成为最小堆。在实现堆调整的基础上,很容易就能实现推的创建。
1.4 堆排序
移除位于第一个数据的根结点,并做最小堆的递归运算。
2.算法实现
2.1 最小堆的实现
|
|
某一次运行的结果如下:
before sort,array is as below:
71 40 36 71 29 93 75 95 20 89 44 16 55 31 32 88 41 7 17 25
after sort,array is as below:
95 93 89 88 75 71 71 55 44 41 40 36 32 31 29 25 20 17 16 7
2.2 最大堆的实现
|
|
某一次的输出结果如下:
before sort,array is as below:
60 47 23 74 87 98 76 36 66 84 77 99 78 14 22 60 28 68 71 3
after sort,array is as below:
3 14 22 23 28 36 47 60 60 66 68 71 74 76 77 78 84 87 98 99
3.算法分析
由于每次重新恢复堆的时间复杂度为O(log2n),共(n-1)次重新恢复堆操作,再加上前面建立堆时n/2次向下调整,故堆排序的时间复杂度为O(nlog2n);