排序——堆排序
2015-06-23 09:58
429 查看
一、什么是堆
堆是具有如下性质的完全二叉树。每个节点大于或者等于其左右孩子结点的值,称为大顶堆。
或者每个结点的值都小于或者等于左右孩子结点的值,称为小顶堆。
二、如果通过堆排序
由堆的定义可以知道,在堆中,顶点最大(或者最小)。我们就可以把堆顶拿出来,再把剩下的再次组成堆。然后再拿出堆顶。
这样就实现排序啦。
还需要解决两个问题:
(1)如何把一凌乱的数据组成堆
(2)把顶点拿出来之后,如何重建堆。
三、如何由一个无序的序列建成一个堆
找到第(n/2)个数。为什么要找到这个数?因为由于慢二叉树的性质可知,此数都是有孩子的结点。
也就是通过这些数,来包含了所有的结点。
for(i=(n/2);i>=1;i--)
{
和自己的左右孩子的最大值比较,如果比它大,则不变动。
如果小,则交换。
}
四、如何在输出堆顶元素后,调整剩余元素成为一个新的堆
(1)将最后一个元素换到顶部。
(2)然后依次和自己的孩子比较,将大的孩子放到堆顶。直到成为叶子节点。
五、时间复杂度为o(n*log(n))
堆是具有如下性质的完全二叉树。每个节点大于或者等于其左右孩子结点的值,称为大顶堆。
或者每个结点的值都小于或者等于左右孩子结点的值,称为小顶堆。
二、如果通过堆排序
由堆的定义可以知道,在堆中,顶点最大(或者最小)。我们就可以把堆顶拿出来,再把剩下的再次组成堆。然后再拿出堆顶。
这样就实现排序啦。
还需要解决两个问题:
(1)如何把一凌乱的数据组成堆
(2)把顶点拿出来之后,如何重建堆。
三、如何由一个无序的序列建成一个堆
找到第(n/2)个数。为什么要找到这个数?因为由于慢二叉树的性质可知,此数都是有孩子的结点。
也就是通过这些数,来包含了所有的结点。
for(i=(n/2);i>=1;i--)
{
和自己的左右孩子的最大值比较,如果比它大,则不变动。
如果小,则交换。
}
四、如何在输出堆顶元素后,调整剩余元素成为一个新的堆
(1)将最后一个元素换到顶部。
(2)然后依次和自己的孩子比较,将大的孩子放到堆顶。直到成为叶子节点。
五、时间复杂度为o(n*log(n))
相关文章推荐
- logcat/Toast.makeText中文显示乱码的解决方法
- jndi配置连接池_成功案例
- linux下操作mysql数据库常用命令
- 和机器学习和计算机视觉相关的数学(一)
- mac 命令行安装软件
- 一、网络基础
- Nodejs环境与express框架
- 四则运算之Right-BICEP测试
- nginx ip_hash负载
- ios开发面试常见问题及答案
- 软件分发管理器Secure Delivery Center基本概念概述(一)
- linux命令- 每日一练(2):cd命令
- pomelo生命周期回调和组件添加
- Oracle删除当前用户下所有的表的方法
- Android客户端通过浏览器注入及清除Cookie
- Matlab与C++混合编程(依赖OpenCV)
- C++实现多线程安全的单例模式 已测试
- 关于树莓派内核编译和驱动编写(1)
- 【Android】各式各样的弹出框与对菜单键、返回键的监听
- 淘宝架构发架