排序问题和离散集合的操作.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
排序问题和离散集合的操作

第三章 排序问题和离散集合的操作 3.1 合并排序 3.1.1 合并排序算法的实现 假定有8个元素,第一步,划分为四对,每一对两个元素,用merge算法合并成四个有序的序列;第二步,把四个序列划分成两对,用merge算法合并成两个有序的序列;最后,再利用merge算法合并成一个有序的序列。 图3.1 合并8个元素的过程 算法3.1 合并排序算法 输入:具有个元素的数组A[] 输出:按递增顺序排序的数组A[] 1. template class Type 2. void merge_sort(Type A[],int n) 3. { 4. int i,s,t = 1; 5. while (tn) { 6. s = t; t = 2 * s; i = 0; 7. while (i+tn) { 8. merge(A,i,i+s-1,i+t-1,t); 9. i = i + t; 10. } 11. if (i+sn) 12. merge(A,i,i+s-1,n-1,n-i); 13. } 14. } :开始合并时第一个序列的起始位置; :合并前序列的大小; :合并后序列的大小; 、、定义被合并的两个序列的边界。 例如,当=11时,算法的工作过程如图3.2所示,过程如下: 1.在第一轮循环,=1、=2,有5对1个元素的序列进行合并,当=10时, ,退出内部的while循环。但,不小于,所以,不执行第12行的合并工作,余留一个元素没有处理。 2.在第二轮,,有两对两个元素的序列进行合并,在时, ,退出内部的while循环。但,所以执行第12行的合并工作,把一个大小为2的序列和另外一个元素合并,产生一个3个元素的有序序列。 3.在第三轮,,有一对四个元素的序列合并,在时, ,退出内部的while循环。而,所以,不执行第12行的合并工作,余留一个序列没有处理。 4.在第四轮,。在时,,所以不执行内部的while循环,但,所以执行第12行的合并工作,产生一个大小为11的有序序列。 5.在进入第五轮时,因为,所以退出外部的while循环,结束算法。 图3.2 =11时的合并排序的工作过程 3.1.2 合并排序算法的分析 一、时间复杂性 假定是2的羃。 外部while循环的循环体的执行次数:次。 内部while循环 merge执行的 所产生 序列 元素比较总次数 merge执行次数 比较次数 序列数 长度 最少 最多 第1轮 1 2 第2轮 2,4 – 1 = 3 4 第3轮 4,8 – 1 = 7 8 第轮 , 合并排序算法的执行时间,至少为: 至多为: 合并排序算法的运行时间,是,也是,因此,是。 二、空间复杂性 每调用一次merge算法,便分配一个适当大小的缓冲区,退出merge算法便释放它。在最后一次调用merge算法时,所分配的缓冲区最大,此时,它把两个序列合并成一个长度为的序列,需要个工作单元。所以,合并排序算法所使用的工作空间为。 3.2 基于堆的排序 3.2.1 堆 一、堆的定义 定义3.2 个元素称为堆,当且仅当它的关键字序列满足: (3.2.1) 或者满足: (3.2.2) 把满足(3.2.1)式的堆称为最小堆(min_heaps);把满足(3.2.2)式的堆称为最大堆(max_heaps)。 二、堆的性质:可看成是一棵完全二叉树。如果树的高度为 1.所有的叶结点不是处于第层,就是处于第层; 2.当时,第层上有个结点; 3.第层上如果有分支结点,则这些分支结点都集中在树的最左边; 4.每个结点所存放元素的关键字,都大于(最大堆)或小于(最小堆)它子孙结点所存放元素的关键字。 三、用数组存放具有个元素的堆 1.根结点存放在; 2.假定结点存放在,如果它有左儿子结点,则它的左儿子结点存放在;如果它有右儿子结点,则它的右儿子结点存放在; 3.非根结点的父亲结点存放在。 例: 图3.3 堆及其数组表示 3.2.2 堆的操作 一般来说,对于堆这样的数据结构,需要下面几种操作: ( void si

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档