第9章排序2学案.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
25 92 48 37 57 92 86 72 31 48 R: {25}{92}{48}{37}{12}{57}{86}{72}{31}{48} T: {25 92} {37 48} {12 57} {72 86} {31 48} R: {25 37 48 92} {12 57 72 86} {31 48} T: {12 25 37 48 57 72 86 92} {31 48} R: {12 25 31 37 48 48 57 72 86 92} 归并排序 归并排序算法: (1) 两个相邻子表的归并: void Merge(RecType SR[], RecType TR[], int i, int m, int n); (2) 对区间[s..t]的归并排序 void Merge(RecType SR[], RecType TR1[], int s, int t); (3) 对整个表的归并排序 void MergeSort(SqList L) 归并排序 两个相邻子表的归并: void Merge(RecType SR[], RecType TR[], int i, int m, int n){ //将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] for(j=m+1,k=i; imj=n; ++k){ if(SR[i].key=SR[j].key) TR[k]=SR[i++]; else TR[k]=SR[j++]; } if(i=m) TR[k..n]=SR[i..m]; if(j=n) TR[k..n]=SR[j..m]; } //end Merge 归并排序 对区间[s..t]的归并排序: void MSort(RecType SR[], RecType TR1[], int s, int t){ //将SR[s..t]归并排序为TR1[s..t] RecType TR2[n]; //定义辅助数组TR2 if(S==t) TR1[s] = SR[s]; else { m=(s+t)/2; //将SR[s..t]平分为SR[s..m]和SR[m+1..t] MSort(SR, TR2, s, m); //SR[s..m]排序成TR2[s..m] MSort(SR, TR2, m+1, t);//SR[m+1..t]排序成TR2[m+1..t] Merge(TR2, TR1, s, m, t); //两个有序的相邻区间归并 } //end MSort 归并排序 整个表的归并排序 void MergeSort(SqList L) //对顺序表L作归并排序 MSort(L.r, L.r, 1, L.length); } //end MergeSort 归并排序 归并排序的非递归算法分三步进行: 两个相邻子表的归并 void Merge(RcdType SR[ ], RcdType TR[ ], int i, int m, int n) { //将有序的SR[i..m]和SR[m+1..n]异地归并为有序的TR[i..n] for (j=m+1, k=i; i=mj=n; k++) { if ( SR[ i ].key=SR[ j ].key ) TR[ k ]=SR[ i++ ]; else TR[ k ]=SR[ j++ ]; } if ( i=m ) TR[ k . . n ]=SR[ i . . m ]; if ( j=m ) TR[ k . . n ]=SR[ j . . n ]; } 归并排序 对排序表所有子表进行一趟归并排序 设子表长度为L, 两个特殊情况必须在算法中加以考虑: (1) 子表的个数是奇数,此时最后一个子表不必归并,直接抄; (2) 最后一个子表的长度可能小于L 归并排序 2. 对排序表所有子表进行一趟归并排序 void MergePass(RcdType SR[ ], RcdType TR[ ], int L, int n) { //对SR[1..n]进行趟归并排序,结果放入TR中,L是子表的长度 for (i=1; i+2*L-1=n; i+=2*L) Merge(SR,TR,i,i+L-1,i+2*L

文档评论(0)

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

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

1亿VIP精品文档

相关文档