思想:
堆排序本质上也是一种选择排序。选择排序是以“重复选择”为思想的。
堆排序算法需要一个辅助算法——堆调整算法。该算法保证元素构成一个堆。
在非降序排序中,使用的是大顶堆(根节点具有最大元素)。首先重新安排序列,使之形成一个大顶堆,然后反复撤销根元素(该步骤即是选择最大元素),并把它送到适当的位置上。
伪代码:
而堆排序的所有操作可以看做以下两部分:
生成大顶堆
For:i从n到2
把根节点放入H[i] //从小到大排序,选择第i个元素放在合适的位置上
调整堆
生成大顶堆的过程
首先要知道两点:
1、 在一个完全二叉树中,叶子节点数=(总结点数+1)/2
2、 任意一个元素都构成一个堆。
具体的生成过程可以有两种选择方式:
1、 H[1]构成了一个大顶堆;然后i从2到n开始,调整H[1,…,i]为大顶堆。
此处用到的堆调整是siftUp,伪代码如下:
For:i从2到n
SiftUp(H,i)
2、 所有的叶子节点都构成各自的堆(即,H[(n+1)/2],H[(n+1)/2+1],….,H[n]都构成各自的大顶堆)。然后,i从n/2到1,调整H[i,…,n]为大顶堆。
此处用到的堆调整是siftDown,伪代码如下:
For i从n/2到1
siftDown (i)
算法分析:
T(n)=O(nlgn)