内部排序.pptVIP

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内部排序

10-* 10.5 归并排序 归并 归并是指将若干个已排序好的有序表合并成一个有序表。两个有序表的归并称为二路归并。 归并排序 将待排序的n个记录,看作n个有序的子序列,每个子序列的长度为1。然后两两归并,得到n/2个长度为2或为1的子序列;再两两归并,...,如此重复,直到得到长度为n的子序列为止。这种排序的方法称为2_路归并排序。 10-* 10.5 归并排序 2_路归并排序的核心操作:将一维数组中前后两个有序序列归并为一个有序序列。 例: 将一维数组49,38,65,97,76,13,27,49进行2_路归并排序: 初始: [49],[38],[65],[97],[76],[13],[27],[49] 第一趟:[38,49],[65,97],[13,76],[27,49] 第二趟:[38,49,65,97],[13,27,49,76] 第三趟: [13,27,38,49,49,65,76,97] 10-* 10.5 归并排序 将两个有序序列归并为一个有序序列的算法 void merge (Sqlist SR,Sqlist TR,int i,int m, int n) //将有序表 SR.r[i..m]以及SR.r[m+1..n]有序归并到 TR.r[i..n]中 { la=i;lb=m+1;lc=i; //序列 la,lb,lc 的始点 while(la=m lb=n) { if LT(SR.r[la].key, SR.r[lb].key) TR.r[lc++]=SR.r[la++] //有序合并 else TR.r[lc++]=SR.r[lb++] } if ( la=m) TR.r[lc..n]=SR.r[la..m]; //剩余复制 if ( lb=n) TR.r[lc..n]=SR.r[lb..n]; } 10-* 10.5 归并排序 一趟归并排序操作 需调用n/(2h)次算法merge,将SR[1..n]前后相邻且长度为h的有序段两两归并,得到前后眼相邻、长度为2h的有序段,并放在TR[1..n]中。整个归并排序需要[log2n]趟。 递归算法:排序区间:R[s..t] 设:m=(int)((low+high)/2) 可递归地对两个子区间R[s..m]和R[m+1..t]进行归并排序。然后将两个已排序子区间合并为一个有序区间。 void MSort(SeqList SR,SeqList TR, ints,int t) //将有序表 SR.r[s..t]有序归并排序到 TR.r[s..t]中 { if (s==t) TR.r[s]=SR.r[s]; else { m=(s+t)/2; MSort( SR,MR,s,m); MSort( SR,MR,m+1,t); merge(MR,TR,s,m,t) } } 10-* 10.5 归并排序 算法分析 每趟归并的时间复杂度为O(n), 整个算法需㏒2n趟。时间复杂度为O(nlog2n)。 归并排序算法虽简单,但占用辅助空间大,实用性差。 10-* 10.6 基数排序 基数排序 是一种无需进行关键字比较的新排序方法,其基本操作是“分配”和“收集”。 基数排序原理 基数排序是按组成关键字的各位的值进行分配和收集,与前面介绍的排序方法不同,它无需进行关键字之间的比较。 设关键字有d 位,每位的取值范围为 r (称为基数),则需要进行d 趟分配与收集,需要设立 r 个队列。例如,若每位是十进制数字,则需要设立10个队列,若每位由小写字母组成,则要设立26个队列 。 10-* 10.6 基数排序 基数排序的步骤 从关键字的低位开始进行第i趟(i=1,2,...d)分配即将单链表中的记录依次按关键字的第i位分配到相应编号的队列中; 分配完毕后,将各队列的记录按队列编号顺序收集成一个单链表; 上一趟形成的链队,作为下一趟的输入,重复⑴⑵,直到第d趟收集完毕,所得单链表已成为有序表。 10-* 10.6 基数排序 例:初始 278—109—063—930—589—184—505—269—008—083 0 1 2

文档评论(0)

118books + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档