- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
10.4 归并排序 基本思想 把k(k≥2)个有序子文件合并在一起,形成一个新的有序 文件。 同时归并k个有序子文件的排序过程称为k-路归并排序。 2-路归并排序---归并2个有序子文件的排序。 例. 将有序文件A和B归并为有序文件C。 A=(2,10,15,18,21,30) B=(5,20,35,40) 按从小至大的次序从A或B中依次取出2,5,10,15,...,40, 顺序归并到C中,得: C=(2,5,10,15,18,20,21,30,35,40) 一般地,2-路归并过程为: 假定文件r[low..high]中的相邻子文件(子表) (r[low],r[low+1],...,r[mid])和(r[mid+1],...,r[high]) 为有序子文件,其中:low≤midhigh 。 将这两个相邻有序子文件归并为有序文件y[low..high],即: (y[low],y[low+1],...,y[high]) 将两个有序子文件归并为有一个有序文件的算法 void merge(r,y,low,mid,high) RecType r[],y[];int low,mid,high; { int k=i=low,j=mid+1; while (i=mid j=high) { if (r[i].key=r[j].key) { y[k]=r[i];i++;}//归并前一个子文件的记录 else { y[k]=r[j];j++;} //归并后一个子文件的记录 k++;} while (j=high) //归并后一个子文件余下的记录 { y[k]=r[j]; j++; k++;} while (i=mid) //归并前一个子文件余下的记录 { y[k]=r[i]; i++; k++;} } // merge 2-路归并排序 假定文件(r[1],r[2],...,r[n])中记录是随机排列的,进行 2-路归并排序,首先把它划分为长度均为1的n个有序子文件, 然后对它们逐步进行2-路归并排序。其步骤如下: 第1趟:从r[1..n]中的第1个和第2个有序子文件开始,调用 算法merge,每次归并两个相邻子文件,归并结果放到y[1..n]中。 在y中形成 ?n/2? 个长度为2的有序子文件。若n为奇数,则y中最 后一个子文件的长度为1。 第2趟:把y[1..n]看作输入文件,将 ?n/2? 个有序子文件两 两归并,归并结果回送到r[1..n]中,在r中形成 ??n/2?/2?个长度为4的有序子文件。若y中有奇数个子文件,则r中最后一个子文 件的长度为2。 ...... 共计经过 ?log2n? 趟归并,最后得到n个记录的有序文件。 例1. 对8个记录作2路归并排序,共进行?log28?=3 趟归并。 例2. 对11个记录作2-路归并排序,进行?log211?=4趟归并。 一趟归并排序算法: void mergepass(r,y,s) // s为子文件的长度 RecType r[],y[];int s;//将r中的子文件归并到y中 { int i=1; while(i+2*s-1=n) //两两归并长度均为s的子文件 { merge(r,y,i,i+s-1,i+2*s-1); i=i+2*s; } if (i+s-1n) //最后两个子长度为s和长度不足s的文件 merge(r,y,i,i+s-1,n); else while(i=n) //复制最后一个子文件,长度≤s { y[i]=r[i]; i++; } } 调用算法mergepass,对文件r[1..n]归并排序的算法 void mergesort(RecType r[],int n) { RecType y[n+1]; int s=1; //子文件初始长度为1 while (sn) { mergepass(r,y,s); //将r[1..n]归并到y[1..n] s=2*s; //修改子文件长度 mergepass(y,r,s); //将y[1..n]归并到r[1..n] s=2*s;
文档评论(0)