9.7.1 堆结构介绍

我们前面讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次正常的,否则如何知道它是最小的记录。
        可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。
如果可以做到每次在选择到最小的记录的同时,并根据比较对其他记录做出相应的调整,那样排序的总体效率就会非常高了。而堆排序(Heap Sort),就是对简单选择排序进行的一种改进,这种改进的效果是非常明显的。堆排序算法是Floyd和Williams在1964年共同发明的,同时,他们发明了堆这样的数据结构。
        回忆一下我们小时候,特别是男同学,基本都玩过叠罗汉的恶作剧。通常都是先把某个要整的人按倒在地,然后大家就一拥而上扑了上去……后果?后果当然就是一笑了知,一个恶作剧而已。不过在西班牙的加泰罗尼亚地区,他们将叠罗汉视为了正儿八经的民族体育活动,如图9-7-1,可以想像当时场面的壮观。

叠罗汉运动是把人堆在一起,而我们这里要介绍的“堆”结构相当于把数字符号堆成一个塔型的结构。当然,这绝不是简单的堆砌。大家看图9-7-2,能够找到什么规律吗?

很明显,我们可以发现它们都是二叉树,如果观察仔细些,还能看出它们都是完全二叉树。左图中根结点是所有元素中最大的,右图的根结点是所有元素中最小的。再细看看,发现左图每个结点都比它的左右孩子要大,右图每个结点都比它的左右孩子要小。这就是我们要讲的堆结构。
        堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(例如图9-7-2左图);或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(例如图9-7-2右图)。
        这里需要注意从堆的定义可知,根结点一定是堆中所有结点最大(小)者。较大(小)的结点靠近根结点(但也不绝对,比如右图小顶堆中60、40均小于70,但它们并没有70靠近根结点)
        如果按照层序遍历的方式给结点从1开始编号,则结点之间满足如下关系:

这里为什么i要小于等于⌊n/2⌋呢?相信大家可能都忘记了二叉树的性质5(详见本书6.6节),其实忘记也不奇怪,这个性质在我们讲完之后,就再也没有提到过它。可以说,这个性质仿佛就是在为堆准备的。性质5的第一条就说一棵完全二叉树,如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点⌊i/2⌋。那么对于有n个结点的二叉树而言,它的i值自然就是小于等于⌊n/2⌋了。性质5的第二、三条,也是在说明下标i与2i和2i+1的双亲子女关系。如果完全忘记的同学不妨去复习一下。
        如果将图9-7-2的大顶堆和小顶堆用层序遍历存入数组,则一定满足上面的关系表达。如图9-7-3。

我们现在讲这个堆结构,其目的就是为了堆排序用的。

出处:http://www.cnblogs.com/cj723/archive/2011/04/21/2024261.html

《大话数据结构》第9章 排序 9.7 堆排序(上)相关推荐

  1. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  2. 《大话数据结构》样章试读

    <大话数据结构>样章试读 各位童鞋,<大话数据结构>从写作到出版,虽然经历了一些坎坷,但终于还是在今天正式在一些网店发售了.现在提供两章的完整版试读PDF文件,希望能给您有所 ...

  3. 《大话数据结构》第9章 排序 9.7 堆排序(下)

    9.7.2 堆排序算法 堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法.它的基本思想是,将待排序的序列构造成一个大顶堆.此时,整个序列的最大值就是堆顶的根结点.将它移走(其实就 ...

  4. 读书笔记-《大话数据结构》第二章算法

    2.3两种算法的比较 #include <iostream> #if 0 //需要运行 100次 int main() {int i,sum=0,n=100;for(i=1;i<=n ...

  5. 【大话数据结构算法】希尔排序

    希尔排序的实质就是分组插入排序,该方法又称为缩小增量排序. 直接插入排序适合于序列基本有序的情况,希尔排序的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了,再来一趟直接插入排序,这样会使排序 ...

  6. 大话数据结构 摘录 第一章 数据结构绪论

    文章目录 启示:数据结构 学习数据机构的重要性 数据结构引发的案例 数据结构的起源 程序设计=数据结构+算法 基础概念与术语 数据 数据元素 数据项 数据对象 数据结构 数据结构:是相互之间存在一种或 ...

  7. 读书笔记-《大话数据结构》第一章数据结构绪论

    1.3数据结构的起源 数据结构:是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科. 程序设计=数据结构+算法 1.4基本概念和术语 1.4.1数据:描述客观事物 ...

  8. 大话数据结构第四章栈的应用

    一.斐波契那数列 就是下一项的值等于相邻的上两项元素之和. 这个规律就是斐波契那数列.由此,我知道这个世界是少不了规律的.就算没有规律也要用规律来逼近描述无规律的现象. 迭代和递归的区别:迭代是循环, ...

  9. 大话数据结构第四章栈的基本概念与出栈入栈操作

    一.栈的顺序存储结构 1.基本概念 栈顶就是表尾. 栈顶是栈插入和删除的地方. 栈就是只允许在表尾进行添加或删除,是顺序存储结构线性表的特例或者说简化. 为什么说是简化呢?相对于顺序存储结构来说栈只允 ...

最新文章

  1. 「黑科技」机器人可以生孩子了,你怕不怕
  2. dw读取access中的图片_怎样从Access数据库中读取图片?解决办法
  3. 我早年在Google学到的10条经验
  4. Hyper-V之02 虚拟机复制与故障转移
  5. python中time库是什么意思_python中time库的time.time()函数的作用是什么
  6. python3 文件模式
  7. 自然数幂求和方法1:扰动法(求两次)
  8. php no route to host,java.net.NoRouteToHostException: No route to host解决方法
  9. linux hadoop etc目录,Hadoop系列——Linux下Hadoop的安装与伪分布式配置
  10. 妙啊!类别不平衡上的半监督学习
  11. 2021年中国一次性卫生设备市场趋势报告、技术动态创新及2027年市场预测
  12. python基本代码教程-python基础教程
  13. 解析二进制文件的工具方法
  14. cpci无法检索_CPCI检索是什么意思
  15. 分享 | 英特尔第二代神经计算棒(Intel Neural Compute Stick 2)相关测试
  16. 微信公众号通过a标签打开小程序
  17. Unable to check if JNs are ready for formatting 问题解决
  18. Tomcat与JDK版本对应关系,Tomcat各版本特性
  19. 【MySQL】这是我见过最有用的MySQL数据类型面试题,面了无数家总结的
  20. (二)海思3519av100开发:开发板环境搭建

热门文章

  1. 2017西南计算机数学基础,[0838]《计算机数学基础》西南大学 2017 秋学期 计算机专业 作业题目及参考答案资料讲解.docx...
  2. Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
  3. mysql和mariadb对比_MySQL并发复制系列三:MySQL和MariaDB实现对比
  4. /bin/bash: jar: command not found
  5. 系统优化怎么做-Tomcat优化
  6. 如何在Ubuntu18.04安装Tesla T4板的驱动程序
  7. 2021-03-04 Halcon初学者知识 【18】谈谈秩滤波(Rank filter)
  8. 社会管理网格化 源码_全市社会治理网格化服务管理工作调研
  9. Vue+ElementUI纯前端技术实现对表格数据的增删改查
  10. 混沌动力学行为研究-分叉图