堆
1 数组对象
2 可以视为一棵完全二叉树
3 一个堆可以被看作一棵二叉树和一个数组,如下图所示:
4 下标计算(通常使用内联函数或者宏来定义下标操作):
- 已知某个结点的下标为i
- 其父节点下标:i/2向下取整
- 左孩子下标:2i
- 右孩子下标:2i+1
5 最大堆:除根节点以外的每个节点i,有A[PARENT(i)] >= A[i]
最小堆:除根节点意外的每个节点i,有A[PARENT(i)] <= A[i]
堆排序
步骤:
- 建大顶堆
- 去堆顶元素与当前堆的最后一个元素进行互换。
- 该堆顶元素已达最终位置,排除出堆
- 对剩下的堆进行最大堆调整
- 重复2到4步
排序过程
1 建堆过程
1)
从第一个非叶子节点开始,对value为8的节点进行调整,无需调整。
2) 对value值为9的节点进行调整。
3) 对value为2的节点调整
4) 对value为3的节点进行调整
----》
5) 对value为7的节点进行调整
---》
建堆完成
2 堆顶元素与当前堆的最后一个元素进行互换。
3 该堆顶元素已达最终位置,排除出堆
4 对剩下的堆进行调整
递归进行堆首和堆尾互换以及调整堆的步骤,结果即为排好序的堆。
代码实现
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
相关成员函数实现
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
测试代码:
?
1 2 3 4 5 |
|
参考资料:
《算法导论 2rd》
http://www.cnblogs.com/Anker/archive/2013/01/23/2873422.html
《算法导论》读书笔记之第6章 堆排序