八大排序之堆排序
来源:互联网 发布:muji.it 编辑:程序博客网 时间:2024/05/18 04:51
1、排序原理
首先对要排序的数组元素的进行比较把它初始化成一个大根堆的形势,此时这个堆的堆顶既原数组的第一个元素是最大的,把它与最后一个元素交换位置,然后在把除了最后一个元素的所有元素重新排列成大根堆,拿第一个和此时的最后一个交换位置,依次执行直到剩余的最后一个元素的下标为0是结束,此时的结果就是排序后的结果。
2、实现步骤:
a)初始化稳定堆
a.1)先找出堆的一些规律,因为这些堆是完全二叉树的形势,所有他的父节点和左右孩子节点的关系应该是(假设父节点是k,则左孩子节点是left = (2 * k + 1),右孩子节点是right= left + 1);
a.2)开始把这个数组的元素按照堆的形势整理,先取第一个元素既k = 0;此时k既是父节点,然后找到他的两个孩子节点,用他们三个进行比较把他们三个组成的堆调整成大根堆;
a.3)如果成功了,就取出第二个元素既k = 1;继续上面的步骤,直到取出一个父节点,而他的左孩子节点或者右孩子节点不小于数组的长度时,结束取值,既不需要去取父节点了;此时堆的初步排序结束;
a.4)因为上面的那一步骤是以每一个最小的大根堆进行排序的(既只根据父节点,两个孩子节点排序,没有管孩子节点是否还有孩子节点)所有很可能后面的排序的时候会把前面的打乱,所有此时应该对上一步骤进行递归运算,把刚才排好的堆进行重新排序,直到所有的堆都已经是稳定堆时结束。(既每一次排序的时候如果有的堆不是稳定堆就要重新排序,当有一次递归的时候不需要排序了,说明此时的堆已经是稳定堆了结束递归);
b)开始排序
b.1)因为经过a步骤堆的最顶端已经是最大值,此时就把那个值和要排序的数组的最后一个值交换位置;
b.2)因为每次交换位置后就已经把数组的最大值排好序了,这个最大值就已经固定了,不需要排序了,所以,此时应该把要排序的长度减少1;
b.3)交换位置后此时的堆已经不是稳定堆,所以要重新整理堆,就把此时的顶当作父节点与他的两个孩子节点比较整理这个堆,如果父节点是和左孩子节点交换位置,那么左孩子节点就不一定是稳定堆了,(但是右孩子节点一定是稳定堆,不需要去整理它)此时就把刚才的左孩子节点当作父节点去整理他自己的两个孩子节点依次类推,如果交换的是右孩子节点,则方法相同,直到没有孩子节点或者交换后的堆依然是稳定堆此时结束整理;
b.4)不断的循环排序的几个步骤,直到要排序的长度小于2的时候结束,此时得到的结果就是排序后的结果。
3、实现代码:
简化代码:
因为初始化堆和排序的方法非常相似,为了节省代码量,可以把初始化堆和排序的方法合并在一起;
结果:
堆初始化后的结果: [5423, 423, 60, 38, 30, 42, 50]
每一次堆整理完成后的结果: [5423, 423, 60, 38, 30, 42, 50]
每一次交换位置后的结果: [50, 423, 60, 38, 30, 42, 5423]
每一次需要排序的数组的长度 : 6
每一次堆整理完成后的结果: [423, 50, 60, 38, 30, 42, 5423]
每一次交换位置后的结果: [42, 50, 60, 38, 30, 423, 5423]
每一次需要排序的数组的长度 : 5
每一次堆整理完成后的结果: [60, 50, 42, 38, 30, 423, 5423]
每一次交换位置后的结果: [30, 50, 42, 38, 60, 423, 5423]
每一次需要排序的数组的长度 : 4
每一次堆整理完成后的结果: [50, 38, 42, 30, 60, 423, 5423]
每一次交换位置后的结果: [30, 38, 42, 50, 60, 423, 5423]
每一次需要排序的数组的长度 : 3
每一次堆整理完成后的结果: [42, 38, 30, 50, 60, 423, 5423]
每一次交换位置后的结果: [30, 38, 42, 50, 60, 423, 5423]
每一次需要排序的数组的长度 : 2
每一次堆整理完成后的结果: [38, 30, 42, 50, 60, 423, 5423]
每一次交换位置后的结果: [30, 38, 42, 50, 60, 423, 5423]
每一次需要排序的数组的长度 : 1
排序完成后的结果 :[30, 38, 42, 50, 60, 423, 5423]
- 八大排序之堆排序
- 八大排序之堆排序
- 八大排序之堆排序
- 八大排序 --选择排序 之 【堆排序】
- 八大排序算法之堆排序
- 八大排序学习之七堆排序
- 八大排序算法之堆排序解析
- 八大排序算法之堆排序
- 八大排序--堆排序
- 八大排序算法 之 堆排序(二叉树排序)
- 八大排序算法-堆排序
- 八大排序算法--堆排序
- 八大内部排序 -- 堆排序
- 八大排序算法-堆排序
- Java提高 - 八大排序方法之堆排序
- Java 八大排序之——堆排序
- 八大排序算法之-堆排序 java代码
- 八大排序算法(四)堆排序
- 机器学习基础(林軒田)笔记之二
- UVA 439 Knight Moves
- Java 设计模式-建造者模式(Builder)Android讲解
- 笔记11:FTP传输协议
- 初学向本地服务器发起网络访问
- 八大排序之堆排序
- 趣味算式填符号
- php与ajax交互——实现php实时返回结果给ajax,并在后台保持继续运行的方法
- 电价基础知识体系结构
- 第7周 贪吃蛇游戏(部分)
- iOS开发 info.plist设置app启动页面
- 日程表
- 静态路由的种类
- AC自动机+矩阵快速幂 POJ 2778