堆排序的完整过程
来源:互联网 发布:山脉户外 知乎 编辑:程序博客网 时间:2024/06/05 15:49
本文是对兰亭风雨大牛的堆排序文章的补充,方便自己回头复习,可以在看完其文章后再看这篇博文。
输入A[0,1,2......n-1]
堆排序的完整过程(以从小到大排序为例,选用最大堆):
一.建堆:我们可以把叶子节点当作堆,在叶子节点的基础上添加非叶子结点,并调整,过程与调整堆一样。
这里要注意数组下标是从0开始,所以节点(i)的左右子节点下标分别为2*i+1,2*i+2。并且第一个非叶子结点下标为
len/2-1.
二.调整堆:原数组建好堆后,将堆顶元素A[0]与堆中最后一个元素A[n-1]交换位置,再调整A[0,1,2....n-2]为最大堆
三.重复第二步,直到还剩下一个元素为止,此时A[0,1,2......n-1]便是从小到大排好序的数组了,并且没有占用额外空间
这里以A=1,3,5,6,2,9,7,4为例,我们看一下完整过程 :
建堆:
第一个非叶子结点下标为len/2-1=8/2-1=3,A[3]=6,所以6以后的2,9,7,4均是叶子节点,可以把这四个节点看成是一个堆,
并且6的左孩子下标为2*3+1=7,A[7]=4.
1.把6插入2,9,7,4组成的堆中
2.将5插入新堆中,5的左右孩子分别为9,7,并调整为新的堆(从9,7中选择较大值与5交换位置),如下:
3.将3插入新堆中,3的左右孩子分别为6,2,并调整为新的堆(从6,2中选择较大值与3交换位置,再从当前3所在位置的左右孩子中选择较大与3替换),如下:
同理将1插入,这样最大堆就建立完毕了
调整堆:
将A[0]=9与A[7]=3,交换位置,则A[7]保存整个堆中最大元素,将剩下元素调整为最大堆
重复这个过程最后A[0,1.....n-1]就是从小到大排好序的数组了
- 堆排序的完整过程
- 创建堆,堆排序的详细实现过程,C++完整代码
- 堆排序的过程
- 堆排序的过程及简单实现
- 堆排序关键过程
- 堆排序完整代码带详解
- 堆排序完整代码带详解(续)
- c++学习连载-堆排序完整程序
- C语言中的堆排序是什么样子的过程
- 堆排序的思想以及实现过程(链式存储)
- 堆排序的实例化(详细过程)
- 算法导论第6章实现堆排序的完整程序
- 学习的完整过程!
- 完整的网络通讯过程
- 内部排序之三:堆排序(含完整源码)
- 堆的建立&堆排序
- 完整的计数排序
- 【堆/排序】堆排序的两种建堆方法
- 深入探讨 Java 类加载器
- 树状数组模拟3个元素的排序 Codeforces 12D Ball
- PullToRefreshListView进阶(四)----->上拉分批加载2种方式
- javascript 解析JSONArray和JSONObject
- JavaScript 学习笔记 (一)
- 堆排序的完整过程
- Android应用开发之所有动画使用详解
- TTS零基础入门之拒绝界面卡顿--加入线程
- 云 虚主机探索之经验总结
- Java对象、Json、Xml转换工具Jackson使用
- 1.大数据基础(上)_2.大数据的商业应用
- CCCamera,CCAtlasNode源码解析
- HDU 4407 Sum (莫比乌斯反演)
- gdb调试多线程