排序算法_HeapSort
大根堆排序的基本思想: 1) 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区; 2) 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key; 3) 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。 然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换, 由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系 R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
1 /* 2 大根堆排序的基本思想: 3 1) 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区; 4 2) 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 5 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key; 6 3) 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。 7 然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换, 8 由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系 R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。 9 */ 10 11 /* 12 @brief: 13 已知L->r[s..len]中记录的关键字除L->r[s]之外均满足堆的定义, 14 本函数调整L->r[s]的关键字,使L->r[s..len]成为一个大顶堆 15 @param: 16 cur: 当前位置 s 17 len: 当前状态的最大值 18 19 m:当前堆的大小 20 */ 21 void HeapAdjust(SqList *L, int cur, int len) 22 { 23 int temp = L->r[cur]; 24 for(int j = 2*cur; j <= len; j *= 2)// 沿关键字较大的孩子结点向下筛选(大根堆) 25 { 26 if(j < len && L->r[j] < L->r[j+1]) 27 ++j; // j为关键字中较大的记录的下标 28 if(temp >= L->r[j]) 29 break; /* 应插入在位置 cur 上 */ 30 31 L->r[cur] = L->r[j]; 32 cur = j; 33 } 34 L->r[cur] = temp; /* 插入 */ 35 } 36 37 /* 对顺序表L进行堆排序 */ 38 void HeapSort( SqList* L ) 39 { 40 for( int i = L->length/2; i>0; i--) /* 把L中的r构建成一个大根堆 */ 41 HeapAdjust(L, i, L->length); 42 43 for( int i = L->length; i>1; i--) 44 { 45 swap(L, 1, i); /* 将堆顶记录和当前未经排序子序列的最后一个记录交换 */ 46 HeapAdjust(L, 1, i-1); /* 将L->r[1..i-1]重新调整为大根堆 */ 47 } 48 }
转载于:https://www.cnblogs.com/uestc999/p/3946766.html
排序算法_HeapSort相关推荐
- 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...
堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...
- 伍六七带你学算法 进阶篇-排序算法
给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...
- C++排序算法实现(更新中)
比较排序法:如冒泡排序.简单选择排序.合并排序.快速排序.其最优的时间复杂度为O(nlogn). 其他排序法:如桶排序.基数排序等.时间复杂度可以达到O(n).但试用范围有要求. 桶排序:排序的数组元 ...
- 十种经典排序算法精粹(c语言版本)
下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...
- 十大排序算法 导图总结
以下为我们经常用到的十大典型排序算法导图,很多设计以及优化的思想值得去参考学习 因为代码较多,所以都添加到对应的实现注释中了,相关代码可以从Mind-mapping获取xmind源文件 参考文档: 基 ...
- C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)
排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序: 直接插入排序 希尔排序 (插入) 冒泡排序 快速排序 (交换) 直接选择排序 ...
- C++拾取——使用stl标准库实现排序算法及评测
今天看了一篇文章,讲各种语言的优势和劣势.其中一个观点:haskell非常适合写算法,因为使用者不用去关心具体的计算机实现,而只要关注于操作语义.这让它在专心研究算法的人中非常受欢迎.所以很多时候,语 ...
- 常用排序算法的C++实现
排序是将一组"无序"的记录序列调整为"有序"的记录序列. 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在 ...
- python 排序算法 简书_Python---简析八大排序算法
前言 1 .排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过 ...
最新文章
- puppet安装与配置
- [XUPT_ACM]寒假第一次比赛题解
- CodeForces - 641ELittle Artem and Time Machine——map+树状数组
- c++ new一个结构体_「C/C++」构造类型及应用:数组、结构体、共用体、枚举类型...
- python做excel表格代码_[宜配屋]听图阁
- Block的引用循环问题 (ARC non-ARC)
- jquery练习——简单的图片结果展示效果
- Android 快速实现微信支付(真的!很快!)
- oracle中pga指什么,oracle中pga内存分配原则
- java通过证书获取CN_java – 从证书DN解析CN [重复]
- 我不断收到“ Uncaught SyntaxError:意外令牌o”
- 网页版 QQ授权登录
- 码率和帧率的含义及区别
- Viojs P1484 ISBN号码
- 交换机和路由器的登陆与管理
- 数理逻辑(一):逻辑学初步
- linux nas mp4 播放器,我的NAS我的地盘 篇十:威联通NAS软件介绍与应用之QVideo篇
- 什么是Lora Mesh网络
- Wpf依赖属性和附加属性在样式中的应用
- 遥感基础之全色波段和多光谱
热门文章
- XSS的基本概念和原理
- OPNET网络仿真分析-目 录
- kubernetes存储系统介绍(Volume、PV、dynamic provisioning,阿里云服务器nfs创建pv,hostpath创建pv)
- jquery中的css函数css(name)、css(key,value)、css(properties)、css(key,fn)
- MSRA-TD500数据集(MSRA Text Detection 500 Database)
- 贺利坚老师汇编课程18笔记:栈的操作SS:SP
- 打开AD16的库librarry
- aov建立Java模拟,JAVA
- wuzhicms 查看模板中的所有可用变量和值
- bzoj 1040: [ZJOI2008]骑士