大根堆排序的基本思想: 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相关推荐

  1. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

  2. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

  3. C++排序算法实现(更新中)

    比较排序法:如冒泡排序.简单选择排序.合并排序.快速排序.其最优的时间复杂度为O(nlogn). 其他排序法:如桶排序.基数排序等.时间复杂度可以达到O(n).但试用范围有要求. 桶排序:排序的数组元 ...

  4. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  5. 十大排序算法 导图总结

    以下为我们经常用到的十大典型排序算法导图,很多设计以及优化的思想值得去参考学习 因为代码较多,所以都添加到对应的实现注释中了,相关代码可以从Mind-mapping获取xmind源文件 参考文档: 基 ...

  6. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  7. C++拾取——使用stl标准库实现排序算法及评测

    今天看了一篇文章,讲各种语言的优势和劣势.其中一个观点:haskell非常适合写算法,因为使用者不用去关心具体的计算机实现,而只要关注于操作语义.这让它在专心研究算法的人中非常受欢迎.所以很多时候,语 ...

  8. 常用排序算法的C++实现

    排序是将一组"无序"的记录序列调整为"有序"的记录序列. 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在 ...

  9. python 排序算法 简书_Python---简析八大排序算法

    前言 1 .排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过 ...

最新文章

  1. puppet安装与配置
  2. [XUPT_ACM]寒假第一次比赛题解
  3. CodeForces - 641ELittle Artem and Time Machine——map+树状数组
  4. c++ new一个结构体_「C/C++」构造类型及应用:数组、结构体、共用体、枚举类型...
  5. python做excel表格代码_[宜配屋]听图阁
  6. Block的引用循环问题 (ARC non-ARC)
  7. jquery练习——简单的图片结果展示效果
  8. Android 快速实现微信支付(真的!很快!)
  9. oracle中pga指什么,oracle中pga内存分配原则
  10. java通过证书获取CN_java – 从证书DN解析CN [重复]
  11. 我不断收到“ Uncaught SyntaxError:意外令牌o”
  12. 网页版 QQ授权登录
  13. 码率和帧率的含义及区别
  14. Viojs P1484 ISBN号码
  15. 交换机和路由器的登陆与管理
  16. 数理逻辑(一):逻辑学初步
  17. linux nas mp4 播放器,我的NAS我的地盘 篇十:威联通NAS软件介绍与应用之QVideo篇
  18. 什么是Lora Mesh网络
  19. Wpf依赖属性和附加属性在样式中的应用
  20. 遥感基础之全色波段和多光谱

热门文章

  1. XSS的基本概念和原理
  2. OPNET网络仿真分析-目 录
  3. kubernetes存储系统介绍(Volume、PV、dynamic provisioning,阿里云服务器nfs创建pv,hostpath创建pv)
  4. jquery中的css函数css(name)、css(key,value)、css(properties)、css(key,fn)
  5. MSRA-TD500数据集(MSRA Text Detection 500 Database)
  6. 贺利坚老师汇编课程18笔记:栈的操作SS:SP
  7. 打开AD16的库librarry
  8. aov建立Java模拟,JAVA
  9. wuzhicms 查看模板中的所有可用变量和值
  10. bzoj 1040: [ZJOI2008]骑士