堆排序
来源:互联网 发布:centos 6.5安装教程 编辑:程序博客网 时间:2024/05/20 06:07
堆排序是一种选择排序,其算法时间复杂度为O(n*lgn),空间复杂度O(1)。
对于堆排序的理解,首先要了解堆,二叉堆,二叉树的数组实现性质,最大堆等,看了很多资料发现自己都不是很理解。而这次通过查看到以下的一篇文章,让我深刻的理解了堆排序的过程。文中的一个数组例子的图表排序过程描述十分详细易懂。因此觉得非常又学习价值,将其图表的描述摘抄了过来,以此分享给大家学习。
参考:
http://www.cnblogs.com/skywang12345/p/3602162.html
堆排序的重要点:
最大堆进行升序排序的基本思想:
① 初始化堆:将数列a[1...n]构造成最大堆。
② 交换数据:将a[1]和a[n]交换,使a[n]是a[1...n]中的最大值;然后将a[1...n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1...n-1]中的最大值;然后将a[1...n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。
使用到数组转换成二叉树的性质:
解析堆排序的实现过程。注意实现中用到了"数组实现的二叉堆的性质"。
在第一个元素的索引为 0 的情形中:
性质一:索引为i的左孩子的索引是 (2*i+1);
性质二:索引为i的左孩子的索引是 (2*i+2);
性质三:索引为i的父结点的索引是 floor((i-1)/2);
堆排序如下面例子:数组{20 30 90 40 70 110 60 10 100 50 80};初始化堆(无序)如下:
1 初始化堆
将数组{20,30,90,40,70,110,60,10,100,50,80}转换为最大堆{110,100,90,40,80,20,60,10,30,50,70}的步骤。
2 交换数据
上面是当n=10时,交换数据的示意图。
当n=10时,首先交换a[0]和a[10],使得a[10]是a[0...10]之间的最大值;然后,调整a[0...9]使它称为最大堆。交换之后:a[10]是有序的!
当n=9时, 首先交换a[0]和a[9],使得a[9]是a[0...9]之间的最大值;然后,调整a[0...8]使它称为最大堆。交换之后:a[9...10]是有序的!
...
依此类推,直到a[0...10]是有序的。
① 初始化堆:将数列a[1...n]构造成最大堆。
② 交换数据:将a[1]和a[n]交换,使a[n]是a[1...n]中的最大值;然后将a[1...n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1...n-1]中的最大值;然后将a[1...n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。
① 初始化堆:将数列a[1...n]构造成最大堆。
② 交换数据:将a[1]和a[n]交换,使a[n]是a[1...n]中的最大值;然后将a[1...n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1...n-1]中的最大值;然后将a[1...n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。
参考:
http://www.cnblogs.com/skywang12345/p/3602162.html
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- JavaScript入门(2)
- struct和typedef struct
- 高级软件工程实验报告(第一次实验)
- Cocos2d-js 解决跨域问题的3种办法
- OCR
- 堆排序
- 解决Nginx部署ThinkPHP项目的办法
- 双创周|9月20日下午天英汇双创大赛主题沙龙:港澳分赛区智慧产业主题交流会
- 对Servlet执行流程的初步认识
- 排序算法--冒泡排序法
- OpenGL中各个坐标系的转化
- 相关linux脚本小技巧
- day08-js语法和常用类
- Java synchronized 中的 while 和 notifyAll