- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第*页 归并排序 ? 算法描述: 归并排序的递归算法 void msort( RecType Sr[], RecType Tr1[], int s, int t ) {//对r[s..t]中记录进行归并排序 if( s == t ) Tr1[s] = Sr[s]; else { m = ( s + t ) / 2; msort( Sr, Tr2, s, m ); msort( Sr, Tr2, m +1, t); merge( Tr2, Tr1, s, m , t ); } } Void MergeSort( SqList L) { msort( L.r, L.r, 1, L.length ); } 第*页 n个记录要进行 多少趟归并? 要归并?Log2n? 趟。 每趟比较次数=n, 赋值次数=n。 归并排序的算法分析 总时间复杂性为O(nlog2n),空间复杂性为O(n)。 归并排序是稳定的。 j? i? j? j? i? i? i? j? i? [13 27 38 49 65 76 97] 一棵有n个树叶的“倒”的完全二叉树, 深度为?Log2n?+1。 第*页 概述——多关键字的排序 基数排序 示例: 已知扑克牌中52张牌面的次序关系为: ?2?3..?A?2?3..?A ?2?3..?A?2?3..?A 每一张牌面有两个关键字: 花色( ?、?、?、?)和面值(2、3、…、K、A),且花色的地位高于面值。现要对扑克牌进行整理。 ? 这是一个多关键字的排序问题。 第*页 概述——多关键字的排序 为实现多关键字排序,通常有两种方法: 如理牌示例中,先按花色,再按面值。 1)最高位优先(MSD法) 先按最高位关键字排序,将序列分成若干子序列,再按次高位关键字排序分成若干更小的子序列,依次重复,最后得到有序序列。 2)最低位优先(LSD法) 从最低位关键字开始排序,然后再对高一位排序,依次重复,直到对最高位排序。 如理牌示例中,先按面值,再按花色。 第*页 概述——多关键字的排序 说明: 以整数关键字为例,若采用最高位优先,则首先按最高位分配,假设关键字取值0~999之间,则可将0~99的放在一个盒子中,100~199的放在另一个盒子中,…,900~999放在最后一个盒子,然后再将每个盒子中的关键字排序。这种分配方法实际上就是把一个整数看成是三位数字组合的复合关键字。 (1)当关键字为多字段时,基数排序是一种很自然的方法,一般说来,最低位优先法要比最高位优先法简单,因为前者是从头到尾进行若干次分配与收集,执行的次数取决于构成关键字成分的多少;而后者则要分配以后处理各子集的排序问题,这通常是一个递归过程。 (2)当关键字为一简单的字段时,也可以采用分配排序的思想。 快速排序某种意义上就是可看成一种最高位优先的分配排序,因为执行快速排序每趟都将关键字分成两组(两个盒子),然后递归处理排序问题。 第*页 基数排序 其中r称为基数。基数的选择和关键字的分解法,因关键字的类型而异。关键字为十进制整数时,最自然的取法是r为10(0~9),当关键字为字符串时,可取r =26(A~Z)。 基本思想:把每一个关键字看成是一个d元组: 排序时先按Kdi的值从小到大将记录分配到r个盒子中,然后依次收集这些记录,再按Kid-1的值分配到r个盒子中,如此反复,直到对K1i分配后收集起来的序列,便是完全排序的序列。 示例 设初始关键字序列为{278,109,063,930,589,184,505,269,008,083}。取 r=10,d=3,c1=0,cdr=9。以10个链队列表示10个箱子,f [i] 和 e[i] 分别为第 i(0≤i≤9) 个队列的头指针和尾指针。 链式基数排序过程示例如下 第*页 278 109 063 930 589 184 505 269 008 083 e[0] e[1] e[2] e[3] e[4] e[5] e[6] e[7] e[8] e[9] 930 063 184 505 278 109 083 008 589 269 f [0] f [1] f [2] f [3] f [4] f [5] f [6] f [7] f [8] f [9] (b) 第一趟分配之后 930 063 083 184 505 278 008 109 589 269 (c) 第一趟收集之后 (a) 初始状
文档评论(0)