ZD第三十讲(归并排序及外排序).pptVIP

  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文档。上传文档
查看更多
ZD第三十讲(归并排序及外排序)

数据结构与算法 ---第三十讲 北方民族大学 计算机科学与工程学院 王伦津 研究员 30、归并排序及外排序 目 录 本章小结 思考与练习 * * 归并排序及外排序 本讲重点:掌握归并排序、二路合并、二路归并排序的思想,学会编写实现该算法的程序,并分析其时间复杂度。了解外排序的有关概念 30.1 归并排序 30.1.1 二路合并 30.1.2 多段2路合并 30.1.3 二路归并排序 30.2 外排序简介 30.1、归并排序 归并排序是一种基于合并有序段的排序方法,即将若干有序段逐步合并,最后合并为一个有序段。对初始记录集,将每个记录视为一个独立的有序段,然后在此基础上逐步合并。因此,归并排序的基础是合并,下面首先讨论合并算法。 30.1.1 二路合并 下面讨论两个有序段的合并。我们把两个有序段(设为升序)中的记录分别记为 as,…,am 和 am+1,…,an。 两个有序段的合并就是形成第三个有序段(升序): bs,…,bn 设i, j分别表示两个有序段中记录的下标,则两个有序段的合并可按下列方法进行: ①当i≤m,且j≤n时,比较a[i]和a[j]键值的大小,若a[i]=a[j],则将a[i]顺序送入另一数组b[],同时使i加1;若a[i]a[j],则将a[j]顺序送入另一数组b[],同时使j加1。 ②当i>m或j>n时,将剩余部分照抄到b[]的末尾。 下面是具体的程序。 void Merge2Sorted(int a[], long s, long m, long n, int b[]) {//二路合并,将有序段a[s]~a[m]和a[m+1]~a[n]合并到b[0]~b[n-s] long i, j, k; ? i=s; j=m+1; k=0; while (i=m j=n) if (a[i] = a[j]) b[k++]=a[i++]; else b[k++]=a[j++]; while (i=m) b[k++]=a[i++]; while (j=n) b[k++]=a[j++]; return; } 对于该算法,由于每次比较就输出一个元素(输出到b中),所以,全部合并后需要比较(或复制)的次数为两个有序段的长度之和,即n-s+1。 由于这里是每次合并两个有序段,所以称为二路合并。显然,也可以同时合并n个有序段(n路合并,n=2) 30.1.2 多段2路合并 设某记录集已分段有序,除最后一个段外,其他各段长度均相等。现考虑如何将它们中从头起的每个两两相邻的段,都分别合并为一个有序段。经过这种合并后,形成一个新的分段有序文件,其每个段(最后段可以例外)的长度都翻了倍,而段数为原来的1/2(或1/2加1)。这种操作称为多段合并。由于每次都是合并两个段,所以称多段2路合并。显然,也可以有多段n路合并。 void MMergeSorted(int a[], long p1,long p2, long len, int b[]) {//多段2路归并:a[p1]-a[p2]中,每len个元素为一个有序段,将从头起的每个连续的 //两段分别合并为一个有序段(即段1与段2,段3与段4,…分别合并)存入b[] long i, j, k; i=p1; k=0; while (i+2*len-1 = p2) {//当从i起的后面有完整的两段时,合并之 Merge2Sorted(a,i, i+len-1, i+2*len-1, b+k); i += 2*len; k+=2*len; } if (i+len = p2) //剩两段,但最后的段长不足len,直接用p2 Merge2Sorted(a, i, i+len-1, p2, b+k ); else //剩一段,或不剩 for (j=i; j=p2; j++) b[k++]=a[j]; } 显然,该算法的执行时间近似为s*p/2,即O(s*m)。这里,p为段数,而s为段长。 30.1.3 二路归并排序 有了上面的几个算法的支持就可以容易地实现归并排序了。这种归并排序称为二路归并排序。二路归并排序的基本思想是:如果序列中有n个记录,可以先把它看成n个段,每个段中只包含一个记录,因而都是排好序的。二路归并排序是先将从头起的两连相邻的段合并(若段数为奇数,则最后一段照抄,下同),完成一趟归并,得到「n/2 个较大的有序段,每个段包含2个记录(最后一段长度可能不足)。然后

文档评论(0)

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

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

1亿VIP精品文档

相关文档