堆排序怎么建立初始堆_学习笔记-详解堆排序
本文目的
上一章节已经详细的向大家介绍过排序的相关概念(详见学习笔记-排序简单介绍) ,本文旨在为大家详细的介绍堆排序。
堆排序
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆是什么
堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆是一种非线性结构。可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲堆其实就是利用完全二叉树的结构来维护的一维数组。此处用到的堆一般是指大顶堆或小顶堆。
大顶堆
每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。如下图所示。
小顶堆
每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图所示。
算法原理
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值,如此反复执行,便能得到一个有序序列了。需要注意的是建立大顶堆时是从最后一个非叶子节点开始从下往上调整的。
算法流程
1. 创建一个堆 R[0……n-1];
2. 把堆首(最大值)和堆尾互换;
3. 把堆的尺寸缩小 1(已经有序的部分不进入下一轮);
4. 重复步骤 2,直到堆的尺寸为 1。
算法实现
操作过程如下:
1,初始化堆:将R[1..n]构造为堆;
2,将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。
#include #define elemType int /*元素类型*/int k=1;//轮次记录 //打印函数 void Print (elemType arr[], int len){int i;for (i=0; i a[son]){ return;}else{//否则交换父子内容再继续子节点和孙节点比较 swap(&a[dad], &a[son]); dad = son; son = dad * 2 + 1; } }} //排序 void Sort(elemType a[], int len){ int i; //初始化,i从最後一个父节点开始调整 for (i = len / 2 - 1; i >= 0; i--){ max_heapify(a, i, len - 1); } for (i = len - 1; i > 0; i--) { //先将第一个元素和已排好元素前一位做交换,再重新调整,直到排序完毕 swap(&a[0], &a[i]); max_heapify(a, 0, i - 1); printf("第===%d===轮排序后结果如下:",k);Print (a, 9);k=k+1; }}int main() {int i; elemType arr[9] = {94,19,29,9,11,1,14,13,29}; printf("待排序的序列为:"); Print(arr, 9); printf(""); Sort (arr,9); printf(""); printf("排好序的结果如下:"); Print(arr, 9); }
算法分析
时间复杂度
堆排序的运行时间主要是消耗在构建堆和在重建堆时的反复筛选上。在构建堆的过程,因为我们是从完全二叉树最下层的非叶子结点开始构建的,将它与其孩子结点进行比较和有必要的互换,对于每个非叶子结点来说,其实最多2次比较和互换,故初始化堆的时间复杂度为O(n)。在正式排序的时候,第i次取堆顶记录和重建堆需要O(logi)的时间(完全二叉树的某个结点到根结点的距离为log2i+1),并且需要取n-1次堆顶记录,因此重建堆的时间复杂度为O(nlogn)。所以总的来说,堆排序的时间复杂度为O(nlogn)。由于堆排序对元素记录的排序状态不敏感,因此它无论最好,最坏,和平均时间复杂度均为O(nlogn)。
空间复杂度
堆排序中只有交换元素时需要1个辅助空间,与问题规模无关,空间复杂度为O(1)。
排序稳定性
在构建堆的过程中无法保证相同值构建前后的相对位置,所以堆排序是不稳定的。
本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。
堆排序怎么建立初始堆_学习笔记-详解堆排序相关推荐
- c++ 冒泡排序_学习笔记-详解冒泡排序
本文目的 上一章节已经详细的向大家介绍过排序的相关概念学习笔记-排序简单介绍,本文旨在为大家详细的介绍冒泡排序. 冒泡排序 冒泡排序(Bubble Sort),是一种较简单的排序算法,是一种交换类排序 ...
- JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet
详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...
- 筛选法建立初始堆_学术简报|基于库仑效率的退役锂离子动力电池储能梯次利用筛选...
郑州大学电气工程学院.国网河南省电力公司电力科学研究院的研究人员郑志坤.赵光金.金阳.赵智兴.高金峰,在2019年<电工技术学报>增刊1上撰文指出,用于电动汽车的锂离子动力电池退役后,具备 ...
- 学习笔记——详解马尔可夫,马尔可夫链,马尔可夫模型,隐马
目录 (一),马尔可夫 (Markov)综述 1.1,随机过程是啥玩意儿 1.2. 马尔可夫链 (Markov Chain)又是什么鬼 1.3一个经典的马尔科夫链实例 (二), 隐马尔可夫 HMM 2 ...
- 小白180天学习笔记详解:零基础如何学习人工智能
人工智能是大家公认的热点和未来趋势,目前对人工智能感兴趣的学生不在少数.一方面人工智能现在已经上升到国家发展战略层面,高校和专业的人工智能培训机构为应对人才缺口,开始着手培养人工智能人才:另一方面,人 ...
- 终于学会数组的使用啦~~~------C语言数组学习笔记详解
本篇文章是对C语言数组内容的学习,将为初学数组的小伙伴们详细剖析数组,相信大家一定可以有所收获,接下来让我们一起学习吧!
- C#学习笔记--详解委托,事件与回调函数
.Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected vo ...
- 图论01.最短路专题_学习笔记+模板
图论01.最短路专题_学习笔记+模板 一.定义与性质 ● 需要的前导知识点 路径 最短路 有向图中的最短路.无向图中的最短路 单源最短路.每对结点之间的最短路 ● 最短路的性质 对于边权为正的图,任意 ...
- db4o_8.0对象数据库官方文档翻译_学习笔记三
紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not ...
最新文章
- linux apache配置多线程,linux apache 日志配置
- 阿里云蒋江伟:我们致力于为世界提供70%的算力 | 凌云时刻
- jeesite如何已生成数据的数据源_使用Jeesite进行二次开发
- C++实现统计从1到n中1出现的次数(另外一种方法)
- python爬虫软件-Python爬虫工具篇 - 必会用的6款Chrome插件
- 意外发现:网盾升级后支持soso和有道
- EdgeConneX公司在都柏林数据中心园区新建数据中心
- linux安装Git依赖的包出错,技术|Linux有问必答:如何在Linux上安装Git
- 2020年平均工资出炉!这个行业最高
- 做到这4点,才是真正的持续交付| 研发效能提升36计
- Problem D: 分数减法——结构体
- ChaiNext:比特币再度考验5W关口
- java字符排序_如何按字母顺序对字符串进行排序java
- lua与python结合_从Python到Lua
- python ssd目标检测_基于自注意力的SSD图像目标检测算法
- 语义分割空间上下文关系_多尺度空间注意的语义分割
- Java二维码的生成以及附加Logo
- 大智慧公式系统:指标公式
- 沟通CTBS,加快山东海化金蝶EAS远程接入
- 计算机网络知识之交换机、路由器、网关、MAC地址
热门文章
- Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)
- python代码计算图像的分辨率
- 第四章 遗传变异的分类
- 社会计算研究组研究方向
- 一种基于三代PacBio测序数据的补洞方法
- STM32固件库的调用
- 衡量微型计算机的性能指标参数有哪些,衡量计算机性能的主要技术指标有哪些?...
- tensorflow model.compile() 示例
- python 遍历文件夹和文件
- 十五、插入排序算法(两种方式)