当前课程知识点:数据结构(下) > 第十章 优先级队列 > (c)堆排序 > 10c-1: 算法
作为完全二叉堆的一个应用,我们这一节来介绍堆排序算法。
是的,谈到优先级队列,我们很自然地就会联想到排序,
因为就功能而言,包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能,
也就是选取其中的最大元。
因此,我们很自然地就可以联想起选择排序。
你应该还记得这样一张插图,我们曾经用它来解释选择排序的原理及过程。
不妨温习一下,在选择排序算法中,我们始终将整个序列分为两部分:
也就是左侧的待排序部分以及右侧的已排序部分,
而且前者中的任何一个元素都不大于后者中的任何一个元素。
因此我们只需反复遍历待排序元素,从中选出最大者,并将它加入到已排序的子序列中。
是的,正因为我们每次都需要对待排序的部分作遍历,从而导致每次选取都需要线性时间,
以致整个算法需要平方量级的时间。
究其原因,可以理解为我们当初对数据结构的理解和掌握还非常有限,
以致于我们还只能够通过一些简单的数据结构来组织待排序的元素。
而经过了一段时间的学习之后,我们已经今非昔比,
我们可以运用更为高级的数据结构来组织这些待排序的元素,
从而实现更高的选取效率。
比如,联想到我们刚刚学过的内容,我们就会很自然地想到用一个完全二叉堆
来取代我们此前简单的线性结构。
如果暂时忽略底层的具体实现,我们就会发现整个算法的流程可以基本保持不变,
此前在预处理阶段对整个线性队列的初始化,在这里则对应于建堆操作。
我们刚刚介绍过,若采用Floyd算法,这一步只需线性时间,
接下来我们需要反复地取出最大元,也就是整个堆当前的堆顶,
我们知道,delMax操作每次只需log(n)的时间。
没错,log(n),而不再是n。
因此,整个算法的复杂度,也就应该是nlog(n),
而不再是n^2。
当然,此前的不变性依然保持,也就是待排序的部分都不超过已排序的部分,
因此算法的正确性依然可以得到保证。
那么难道这个算法就是这样的平淡无奇?
不是的,事实上堆排序的奥妙还不止于此,
比如在空间复杂度方面,堆排序算法还可以做得更好。
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试