网站大量收购独家精品文档,联系QQ:2885784924

第二十二讲.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二十二讲ppt整理

10.5归并排序 10.6各种排序方法的比较 本章小结 * 第二十二讲 1、归并排序 2、总复习 归并排序(Merge Sort)也是一种常用的排序方法,“归并”的含义是将两个或两个以上的有序表合并成一个新的有序表。如图8-11为两组有序表的归并,有序表{4,25,34,56,69,74}和{15,26,34,47,52},通过归并把它们合并成一个有序表{4,15,25,26,34,34, 47,52, 56,69,74}。 图8-11 两组有序表的归并 二路归并排序的基本思想是:将有n个记录的待排序列看作n个有序子表,每个有序子表的长度为1,然后从第一个有序子表开始,把相邻的两个有序子表两两合并,得到n/2个长度为2或1的有序子表(当有序子表的个数为奇数时,最后一组合并得到的有序子表长度为1),这一过程称为一趟归并排序。再将有序子表两两归并,如此反复,直到得到一个长度为n的有序表为止。上述每趟归并排序都需要将相邻的两个有序子表两两合并成一个有序表,这种归并方法称为二路归并排序。 1.两个有序表的合并算法Merge( )。 设线性表R[low..m],和R[m+1..high]是两个已排序的有序表,存放在同一数组中相邻的位置上,将它们合并到一个数组Rl中,合并过程如下: (1) 比较线性表R[low..m]与R[m+1..high]的第一个记录,将其中关键字值较小的记录移入表R1(如果关键字值相同,可将R[low..m]的第一个记录移入R1中)。 (2) 将关键字值较小的记录所在线性表的长度减1,并将其后继记录作为该线性表的第一个记录。 反复执行上述过程,直到线性表R[low..m]或R[m+1..high]之一成为空表,然后将非空表中剩余的记录移入R1中,此时Rl成为一个有序表。 算法描述如下: void Merge(RecType R[],RecType R1[],int low,int m,int high) { //R[low..m]和R[m+1..high]是两个有序表 int i=low, j=m+l, k=low; //k是Rl的下标,i、j分别为R[low..m]和R[m+1..high]的下标 while(i=mj=high){ //在R[low..m]和R[m+1..high]均未扫描完时循环 if(R[i].key=R[j].key){ //将R[low..m]中的记录放入R1中 R1[k]=R[i]; i++; k++; } else{ //将R[m+1..high]中的记录放入R1中 R1[k]=R[j]; j++; k++; } } while(i=m){ //将R[low..m]余下部分复制到R1 R1[k]=R[i]; i++; k++; } while(j=high){ //将R[m+1..high]余下部分复制到R1 R1[k]=R[j]; j++;k++; } } 2.一趟归并排序的算法MergePass( )。 一趟归并排序的算法调用n/(2*length)次归并算法merge( ),将R[1..n]中前后相邻且长度为length的有序子表进行两两归并,得到前后相邻且长度为2*length的有序表,并存放在R1[1..n]中。如果n不是2*length的整数倍,则可出现两种情况:一种情况是,剩下一个长度为length的有序子表和一个长度小于length的子表,合并之后其有序表的长度小于2*length;另一种情况是,只剩下一个子表,其长度小于等于length,此时不调用算法merge( ),只需将其直接放入数组R1中,准备进行下一趟归并排序。 算法描述如下: void MergePass(RecType R[],RecType R1[],int length, int n) { int i=0,j; while(i+2*length-ln){ Merge(R,R1,i,i+length-1,i+2*length-1); i=i+2*length; //归并长度为length的两相邻有序子表 } if(i+length-1n-1) //余下两个有序子表,其中一个长度小于lengh Merge(R,R1,i,i+length-1,n-1); //归并两个有序表 else for(j=i;jn;j++) //剩

文档评论(0)

zyzsaa + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档