第10章内排序案例.ppt

  1. 1、本文档共90页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
void Merge(RecType R[],int low,int mid,int high) { RecType *R1; int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下标 R1=(RecType *)malloc((high-low+1)*sizeof(RecType)); while (i=mid j=high) if (R[i].key=R[j].key) //将第1段中的记录放入R1中 { R1[k]=R[i]; i++;k++; } else            //将第2段中的记录放入R1中 { R1[k]=R[j]; j++;k++; } Merge()实现了一次归并 : 空间复杂度为O(high-low+1) while (i=mid) //将第1段余下部分复制到R1 { R1[k]=R[i]; i++;k++; } while (j=high) //将第2段余下部分复制到R1 { R1[k]=R[j]; j++;k++; } for (k=0,i=low;i=high;k++,i++) //将R1复制回R中 R[i]=R1[k]; free(R1); } void MergePass(RecType R[],int length,int n) { int i; for (i=0;i+2*length-1n;i=i+2*length) //归并length长的两相邻子表 Merge(R,i,i+length-1,i+2*length-1); if (i+length-1n) //余下两个子表,后者长度小于length Merge(R,i,i+length-1,n-1); //归并这两个子表 } MergePass()实现了一趟归并 二路归并排序算法如下: void MergeSort(RecType R[],int n) { int length; for (length=1;lengthn;length=2*length) MergePass(R,length,n); } 例10.7 设待排序的表有8个记录,其关键字分别为{18,2,20,34,12,32,6,16,1,5}。说明采用归并排序方法进行排序的过程。 18 2 20 34 12 32 6 16 1 5 初始: 2 18 20 34 12 32 6 16 1 5 2 18 20 34 6 12 16 32 1 5 2 6 12 16 18 20 32 34 1 5 1 2 5 6 12 16 18 20 32 34 log210取上界为4 第1趟 第2趟 第3趟 第4趟   容易看出,对 n 个记录进行归并排序的时间复杂度为Ο(nlogn)。即: 每一趟归并的时间复杂度为 O(n), 总共需进行 ?log2n? 趟。 二路归并 多路归并 例如,对任意的7个关键字进行基于比较的排序,至少要进行 次关键字之间的两两比较。 A.13 B.14 C.15 D.16 解:基于“比较”进行排序的算法在最坏情况下所需进行的比较次数至少为?log2(n!)?。?log2(7!)?=13。本题答案为A。 例如,若数据元素序列{11,12,13,7,8,9,23,4,5}是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是 。 A. 起泡排序 B. 插入排序 C. 选择排序 D. 二路归并排序 本题为2009年全国考研题 例如,数据序列{8,9,10,4,5,6,20,1,2}只能是 的两趟排序后的结果。 A. 简单选择排序 B.

文档评论(0)

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

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

1亿VIP精品文档

相关文档