- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
95 归并排序.ppt
9.5 归并排序 一次二路归并排序算法的C语言程序 void Merge(DataType a[], int n, DataType swap[], int k) /*k为有序子数组的长度,一次排序后的有序子序列存于数组swap中*/ { int m = 0, u1,l2,i,j,u2; int l1 = 0; /*第一个有序子数组下界为0*/ while(l1+k = n-1) { l2 = l1 + k; /*计算第二个有序子数组下界*/ u1 = l2 - 1; /*计算第一个有序子数组上界*/ u2 = (l2+k-1 = n-1)? l2+k-1: n-1;/*计算第二个有序子数组上界*/ /*两个有序子数组合并*/ for(i = l1, j = l2; i = u1 j = u2; m++) { if(a[i].key = a[j].key) { swap[m] = a[i]; i++; } 3、二路归并排序算法分析: 9.6 基数排序 1. 什么是“多关键字”排序?实现方法? 多关键字排序的实现方法通常有两种: 2. 单逻辑关键字怎样“按位值”排序? 讨论:是借用MSD方式来排序呢,还是借用LSD方式? 计算机怎样实现LSD算法? 这种LSD排序方法称为: * 基数排序算法的基本思想: 设待排序的数据元素关键字是m位d进制整数(不足 m位的关键字在高位补0),设置d个桶,令其编号分别为0,1,2,…,d-1。首先,按关键字最低位的数值依次把各数据元素放到相应的桶中;然后,按照桶号从小到大和进入桶中数据元素的先后次序收集分配在各桶中的数据元素;这样,就形成了数据元素集合的一个新的排列,称这样的一次排序过程为一次基数排序。再对一次基数排序得到的数据元素序列按关键字次低位的数值依次把各数据元素放到相应的桶中,然后按照桶号从小到大和进入桶中数据元素的先后次序收集分配在各桶中的数据元素。这样的过程重复进行,当完成了第m次基数排序后,就得到了排好序的数据元素序列。 讨论:所用队列是顺序结构,浪费空间,能否改用链式结构? 例: 第一趟收集的结果: 第二趟收集的结果: 基于链式队列的基数排序算法: 基数排序算法分析 9.7 各种内部排序方法的性能比较 课练1:若初始记录基本有序,则选用哪些排序方法比较适合?若初始记录基本无序,则最好选用哪些排序方法?请解释理由(排序方法各列举两种即可)。 * * 1、归并排序的基本思想是:将两个(或以上)的有序表组成新的有序表。(归并排序主要是二路归并排序) 2、二路归并排序:可以把一个长度为n 的无序序列看成是 n 个长度为 1 的有序子序列 ,首先做两两归并,得到 ?n / 2? 个长度为 2 的有序子序列 ;再做两两归并,…,如此重复,直到最后得到一个长度为 n 的有序序列。 例8:关键字序列T= (21,25,49,25*,93,62,72,08,37,16,54),请给出归并排序的具体实现过程。 21 25 25* 93 62 72 08 37 16 54 49 21 25 25* 49 62 93 08 72 16 37 54 16 37 54 21 25 25* 49 08 62 72 93 08 21 25 25* 49 62 72 93 08 16 21 25 25* 37 49 54 62 72 93 len=1 len=2 len=4 len=8 len=16 16 37 54 整个归并排序仅需?log2n ?趟 else { swap[m]=a[j]; j++; } } /*子数组2已归并完,将子数组1中剩余的元素存到数组swap中*/ while(i = u1) { swap[m] = a[i]; m++; i++; } /*子数组1已归并完,将子数组2中剩余的元素存到数组swap中*/ while(j = u2) { swap[m] = a[j]; m++; j++; } l1 = u2 + 1; } /*将原始数组中只够一组的数据元素顺序存放到数组swap中*/ for(i = l1; i n; i++, m++) swap[m] = a[i]; } 时间效率: O(nlog2n) 因为在递归的归并排序算法中,函数Merge( )做一趟两路归并排序,需要调用merge ( )函数 ?n/(2len)? ? O(n/len) 次,而每次merge( )要执行比较O(len)次,另外整个归并过程有?log2n? “层” ,所以算法总的时间复杂度为O(nlog2n)
您可能关注的文档
最近下载
- 某公司完整版审批权限表.doc VIP
- 2025浙江杭州青山湖科技城投资集团有限公司下属子公司招聘11人考试模拟试题及答案解析.docx VIP
- 马自达-马自达6阿特兹-产品使用说明书-马自达6阿特兹 2.5L蓝天尊崇版-CA7250ATE4-MAZDA6ATENZA用户手册.pdf VIP
- 泡泡玛特简介.pptx VIP
- 马勒第一交响曲(钢琴版)第3乐章.pdf VIP
- 西门子断路器3WL操作手册.pdf
- 《产业园区投建营数字化平台建设指南》.pdf VIP
- 00015 《英语(二)》高频 100 题.doc VIP
- 2024年一建管理真题完整.docx VIP
- 中医面诊知识培训课件.pptx VIP
文档评论(0)