小白学算法2.7——堆排序
来源:互联网 发布:python ma优化 编辑:程序博客网 时间:2024/05/29 13:24
小白学算法2.7——堆排序
标签: 小白学算法
1.堆排序算法
堆排序属于高级排序,时间复杂度为
二叉堆的相关内容请阅读小白学算法1.3——堆
优先队列相关内容请阅读小白学算法1.4——优先队列
第一阶段:构造有序的二叉堆
把一个无序的堆有序化成一个二叉堆,最容易想到的一个算法就是从数组的左端向右,针对每个元素调用swim()方法,类似于向优先队列中一个一个插入元素的过程。不过一般情况下最容易想到的算法往往不是最好的算法。更好的方法是从这个树的最后一个父结点开始向前调用sink()方法,第一次调用sink()后有一个父结点及其子结点成为了子二叉堆堆,依次向前进行,直到这一层的的父结点及其子结点都是单独的子二叉堆,然后再针对上一层调用sink()方法,可以把属于同一个父结点的子二叉堆合成一个新的更大的子二叉堆……直到对根节点调用sink()方法后,一个有序的二叉堆就建立了。
第二阶段:下沉排序
将二叉堆中最大的结点(根结点)和最后的结点交换,将二叉堆的结点数目减一,然后对新的根结点调用sink()方法,进行堆的有序化。重复以上过程,直到二叉堆的结点数目为1为止,这个时候数组中的元素从左到右依次非递减变化。
2.堆排序实现
void heapSort(int* a, int n){ //第一阶段 for (int k=n/2; k>=1; k--)//a[n]是最后一个结点,其父节点为a[n/2] sink(a, n, k); //第二阶段 while (n>1) { swap(a, 1, n--); sink(a, n, 1); }}
3.总结
- 堆排序是不稳定排序
- 堆排序是唯一能够同时最优地利用时间和空间的算法
- 堆排序在嵌入式或者低成本的操作系统中使用比较多,在现代操作系统中很少使用,因为其无法有效利用缓存
0 0
- 小白学算法2.7——堆排序
- 排序算法—堆和堆排序
- 排序算法—堆排序
- 排序算法——堆排序算法
- 算法简介—堆与堆排序
- 算法 —— 堆排序
- 算法——堆排序
- 算法系列—堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 常用排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 算法——排序之堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 排序算法系列——堆排序
- 关于centOS无法识别1920*1080分辨率的解决方法
- 【Solutions系列】在线关阀分析
- 布隆过滤器 (Bloom Filter) 详解
- Grid++Report实现Web报表
- 软件工程实现阶段
- 小白学算法2.7——堆排序
- iOS开发 - Bitcode适配指南
- 电商架构及搜索引擎
- JVM调优总结 -Xms -Xmx -Xmn -Xss
- ABAP选择屏幕权限控制
- 我的mpi学习实践
- 计算机技术领域当前的主流技术及其社会需求调查报告
- 随机生成数字(ashx文件,调用上篇所写发送邮件代码)
- 获取当前JVM所有可设置的参数以及当前默认值