堆排序算法,附图与C++代码
来源:互联网 发布:手机淘宝触屏版首页 编辑:程序博客网 时间:2024/06/05 01:34
堆的意思就是上面的都比下面大,或者小。
举个例子,下图就是个最小堆,父节点都比子节点小。如果将其反过来,父节点都比子节点大,那就是最大堆。
如图,想象一下东西是怎么磊成堆的,就能理解这个名字的精妙了。
1
/ /
2 7
/ / / /
3 4 8 9
堆很容易就可以用数组表示,任意元素i,其子节点就是[2*i],[2*i+1],其父节点就是[j/2],写起来很简单吧,也很容易理解。
堆排序的思想就是利用堆的这种父子节点大小关系的特性,来降低比较次数。
想象一下单循环淘汰赛,比如说欧洲冠军杯。先捉对厮杀,再一层一层往上走。堆排序就是这么做的。第一次从N中选出冠军。然后将冠军拿掉,剩下的N-1再选,以此计算,直到剩最后一个时,全部排序也就完成了。
举个例子:数组为:2, 5, 3, 2, 3, 0, 8, 1
得到初始状态如下图:
2
/ /
5 3
/ / / /
2 3 0 8
/
1
选出第一个冠军:
8
/ /
5 2
/ / / /
2 3 0 3
/
1
将冠军移到最后,然后,图也就变成
1
/ /
5 2
/ / / /
2 3 0 3
8
继续选冠军:
5
/ /
1 3
/ / / /
2 3 0 2
8
再将冠军移到树的最后:
2
/ /
1 3
/ / / /
2 3 0 5
8
继续选冠军:
3
/ /
2 3
/ / /
2 1 0 5
8
再将冠军移到树的最后:
0
/ /
2 3
/ /
2 1 3 5
8
继续选冠军:
3
/ /
2 0
/ /
2 1 3 5
8
再将冠军移到树的最后:
1
/ /
2 0
/
2 3 3 5
8
继续选冠军:
2
/ /
1 0
/
2 3 3 5
8
再将冠军移到树的最后:
2
/ /
1 0
2 3 3 5
8
继续选冠军:
2
/ /
1 0
2 3 3 5
8
再将冠军移到树的最后:
0
/
1 2
2 3 3 5
8
继续选冠军:
1
/
0 2
2 3 3 5
8
再将冠军移到树的最后:
0
1 2
2 3 3 5
8
搞定啦!
0, 1, 2, 3, 3, 5, 8
代码如下:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/made_in_chn/archive/2010/04/12/5473871.aspx
- 堆排序算法,附图与C++代码
- 堆排序算法代码
- 算法导论第六章 堆排序C++源码(附图)
- 【c++】堆排序算法
- C算法--堆排序
- 【数据结构与算法】【排序】堆排序的代码实现
- 排序算法 - 堆排序 (C++)
- 算法代码实现之堆排序,C/C++实现
- 算法 排序乐园 堆与堆排序
- 八大排序算法及完整c代码—堆排序c、java代码
- 算法学习与代码实现5——堆排序
- 堆排序算法代码实现
- 堆排序算法伪代码
- 堆排序 纯C代码
- 堆排序C语言代码
- 数据结构与算法(C语言版)__堆排序
- 数据结构与算法:堆与堆排序
- 数据结构与算法-堆与堆排序
- oracle 修改日志大小及增加日志成员
- Linux环境下Maven仓库的搭建(nexus)及Mavan的简单使用
- 怎么减少错误的发生
- Android横竖屏切换
- Tcpmp音频文件解码流程分析
- 堆排序算法,附图与C++代码
- 修改Windows下软件默认安装路径
- java 创建文件+写入文件
- IOU配套脚本------ 自动通过gnome-terminal tab页连接IOU
- Java中的事务处理
- 开始贴VB编程的学习过程
- 3d世界尽在掌握!—— directx 8.1/9 graphic 全解析
- 穷学生
- CSS样式清零