数据结构(09.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一般情况下,对多关键字排序的定义为:假设含有n记录的序列为: (R1,R2 ,…,Rn )      每个记录Ri中含有d个关键字( ), 则称该记录序列对关键字( )有序是指:对于序列中任意两个记录Ri和Rj(1≤ij≤n)都满足下列有序关系:       其中K0被称作最主位关键字,Kd-1被称作最次位关键字。 通常实现多关键字排序可以有两种策略: 最高位优先法(MSD):先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。 最低位优先法(LSD):先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。使用这种排序方法对每一个排序码进行排序时,不需要再分组,而是整个对象组都参加排序。 在MSD法中,先按高位关键字将待排序数据分成子序列,然后再对各子序列按下一个关键字排序;而使用LSD法进行排序时,对每个关键字都是将整个序列按关键字分组,然后按顺序收集,显然LSD法,操作比较简单。 单逻辑关键字怎样“按位值”排序? 设n 个记录的序列为:{V0, V1, …, Vn-1 },可以把每个记录Vi 的单关键码 Ki 看成是一个d元组(Ki1, Ki2, …, Kid),则其中的每一个分量Kij ( 1? j ? d ) 也可看成是一个关键字。 4 注1: Ki1=最高位,Kid=最低位;Ki共有d位,可看成d元组; 注2: 每个分量Kij (1 ? j ? d ) 有radix种取值,则称radix为基数。 26 (9, 8, 4) (0, 1, …, 9) (a, b, …, z) (d, i, a, n) 3 10 例1:关键码984可以看成是 元组;基数radix 为 。 例2:关键码dian可以看成是 元组;基数radix 为 。 思路: 链式基数排序 基数排序:是典型的LSD排序方法, 利用“分配”和“收集”对单逻辑关键字进行排序。在这种方法中,把单关键字Ki看成是一个d元组: 其中的每一个分量 ( 1? j ? d ) 也可看成是一个关键字。 链式基数排序:是用RADIX个链队列作为分配队列,关键码相同的记录存入同一个链队列中,收集则是将各链队列按关键码大小顺序链接起来。 链式基数排序实现思路: 针对 d 元组中的每一位分量,把原始链表中的 所有记录, 按Kij的取值,让 j = d, d-1, …, 1, ① 先“分配”到radix个链队列中去; ② 然后再按各链队列的顺序,依次把记录从链队列中“收集”起来; ③ 分别用这种“分配”、“收集”的运算逐趟进行排序; ④ 在最后一趟“分配”、“收集” 完成后,所有记录就按其关键码的值从小到大排好序了。 请实现以下关键字序列的链式基数排序: T=(614,738,921,485,637, 101,215,530,790,306) 例: 614 921 485 637 738 101 215 530 790 306 第一趟分配 e[0] e[1] e[2] e[3] e[4] e[5] e[6] e[7] e[8] e[9] 614 738 921 485 637 101 215 530 790 306 f[0] f[1] f[2] f[3] f[4] f[5] f[6] f[7] f[8] f[9] 原始序列链表: r[0]→ (从最低位 i = 3开始排序,f[ ] 是队首指针,e[ ] 为队尾指针) 第一趟收集(让队尾指针e[i] 链接到下一非空队首指针f[i+1 ] 即可) 530 790 921 101 614 485 215 306 637 738 r[0]→ 第一趟收集的结果: e[0] e[1] e[2] e[3] e[4] e[5] e[6] e[7] e[8] e[9] 614 738 921 485 637 101 215 530 790 306 f[0] f[1] f[2] f[3] f[4] f[5] f[6] f[7] f[8] f[9] 第二趟分配(按次低位 i = 2 ) 5

文档评论(0)

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

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

1亿VIP精品文档

相关文档