第九章排序 南京大学计算机科学和技术系.ppt

第九章排序 南京大学计算机科学和技术系.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 概述 插入排序 交换排序 选择排序 归并排序 基数排序 内容 基数排序 采用“分配”与“收集”的办法 用对多排序码进行排序的思想实现对单排序码进行排序的方法。 基数排序 (Radix Sort) 以扑克牌排序为例。每张扑克牌有两个“排序码”:花色和面值。其有序关系为: 花色:? ? ? ? ? ? ? 面值:2 3 4 5 6 7 8 9 10 J Q K A 把所有扑克牌排成以下次序: ? 2, …, ? A, ? 2, …, ? A, ? 2, …, ? A, ? 2, …, ? A 多排序码排序的例子 多排序码排序后形成的有序序列叫做词典有序序列。 一般情况下,假定有一个 n 个元素的序列 {V0, V1, …, Vn-1 },且每个元素Vi 中含有 d 个排序码 如果对于序列中任意两个元素Vi 和Vj (0≤i j ? n-1 ) 都满足: 则称序列对排序码 (K1, K2, …, Kd) 有序。其中,K1 称为最高位排序码,Kd 称为最低位排序码。 如果排序码是由多个数据项组成的数据项组,则依据它进行排序时就需要利用多排序码排序。 最高位优先MSD(Most Significant Digit first ) 最低位优先LSD(Least Significant Digit first) 最高位优先法通常是一个递归的过程: 先根据最高位排序码 K1排序, 得到若干元素组, 元素组中各元素都有相同排序码K1。 再分别对每组中元素根据排序码 K2 进行排序, 按 K2 值的不同, 再分成若干个更小的子组, 每个子组中的元素具有相同的 K1和 K2值。 依此重复, 直到对排序码Kd完成排序为止。 最后, 把所有子组中的元素依次连接起来,就得到一个有序的元素序列。 最低位优先法 首先依据最低位排序码Kd对所有元素进行一趟排序, 再依据次低位排序码Kd-1对上一趟排序的结果再排序, 依次重复,直到依据排序码K1最后一趟排序完成,就可以得到一个有序的序列。 使用这种排序方法对每一个排序码进行排序时,不需要再分组,而是整个元素组都参加排序。 实现单排序码排序 LSD和MSD方法也可应用于对一个排序码进行的排序。此时可将单排序码 Ki 看作是一个子排序码组: 链式基数排序 基数排序是典型的LSD排序方法, 利用“分配”和“收集”对单排序码进行排序。在这种方法中,把单排序码 Ki 看成是一个d元组: 其中的每一个分量 (1≤j≤d) 可看成是一个排序码。 分量 有radix种取值, 称radix为基数。 例如,排序码984可以看成是一个3元组(9, 8, 4), 每一位有 0, 1, …, 9 等10种取值,基数radix = 10。 排序码‘data’可以看成是一个4元组(d,a,t,a), 每一位有‘a’,‘b’, …, ‘z’等26种取值,radix = 26。 对d元组中的每一位分量, 把元素序列中的所有元素, 按 的取值,先“分配”到rd个队列中去。 按各队列的顺序,依次把队列中的元素“收集”起来,这样所有元素按取值 排序完成。 对于所有元素的排序码K0, K1, …, Kn-1, 依次对各位的分量, 让 j = d, d-1, …, 1, 分别用“分配”、“收集”的运算逐趟进行排序。 在最后一趟“分配”、“收集” 完成后, 所有元素就按其排序码的值从小到大排好序了。 各队列采用链式队列结构, 分配到同一队列的排序码用链接指针链接起来。每一队列设置两 个队列指针 int front [radix]指示队头 int rear [radix] 指向队尾 为了有效地存储和重排 n 个待排序元素,以静态链表作为它们的存储结构。 基数排序的“分配”与“收集” 614 921 485 637 738 101 215 530 790 306 第一趟分配(按最低位 i = 3 ) re[0] re[1] re[2] re[3] re[4] re[5] re[6] re[7] re[8] re[9] 614 738 921 485 637 101 215 530 790 306 fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[

文档评论(0)

fangsheke66 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档