- 1、本文档共97页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法 第9章 排序
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 例4 荷兰国旗问题: 设有一个仅由红、白、蓝三种颜色的色条组成的序列,要求在O(n) 的时间内将其排列成荷兰国旗。 例如:初始序列为[蓝,白,红,白,蓝,红,白,白,红,蓝] 要求排列结果为[红,红,红,白,白,白,白,蓝,蓝,蓝] 算法选择:1、简单选择排序思想; 2、快速排序思想; 3、基数排序思想。 两趟选择:第1趟选红色,第2趟选白色。 算法见P333. 经过1趟分配、收集即可。 荷兰国旗问题的快速排序算法 设3个指示器r,w,b, 指示各区下一个单元;初始时:r=w=0;b=n-1,w相当于low,b相当于high处理; 最终:[1..r-1]红色,[r..w-1]白色,[w..n-1]蓝色。 Void sord(int L[ ], int n) {int x,r,w,b; r=w=0;b=n-1 while(w=b) {x=L[W];if (x==1) {L[w]=L[r]; w++; L[r]=x; r+=;} else if (x==2) w++; else {L[w]=L[b]; L[b]=x; b--;} }} 第九章结束 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 52, 23, 80, 36, 68, 14 [ 52, 23, 80] [36, 68, 14] [ 52, 23 ] [80] [ 52] [ 23, 52] [ 23, 52, 80] [36, 68] [14] [36] [68] [36, 68] [14, 36, 68] [ 14, 23, 36, 52, 68, 80] [23] 完整的归并排序过程为:先分组再归并。 合并算法 void Merge ( RecordType r1[], int low, int mid, int high, RecordType r[]) /*r1[low..mid]和r1[mid+1..high]分别有序,将它们合并*/ {i=low;j=mid+1; k=low; while ( (i=mid)(j=high) ) {if ( r1[i].key=r1[j].key ) {r[k]=r1[i] ; ++i;} else {r[k]=r1[j] ; ++j;} ++k ; } if ( i=mid ) r[k..high] =r1[i..mid]; if ( j=high ) r[k..high] =r1[j..high]; } 2-路归并排序算法 void MergeSort (RecordType r1[], int low, int high, RecordType r[]) /*r1[low..high]经排序后放在r[low..high]中,r2[low..high]为辅助空间 */ { RecordType r2 [hight-low+1] ; if ( low==high ) r[low]=r1[low]; else{mid=(low+high)/2; MergeSort(r1,low, mid, r2); MergeSort(r1,mid+1,high, r2); Merge (r2,low,mid,high, r);} } 稳定? 归并排序的复杂度分析: 容易看出,对 n 个记录进行归并排序的时间复杂度为Ο(nlogn)。即: 每一趟归并的时间复杂度为 O(n), 总共需进行 ?log2n? 趟。 归并排序的空间复杂度较高,需要有长度为n的辅助数组,即为O(n)。 9
文档评论(0)