网站大量收购独家精品文档,联系QQ:2885784924
  1. 1、本文档共88页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DS09-排序

关键字 假设被排序的对象是由一组记录组成的文件,记录由若干个数据项(或域)组成,其中有一项可用来标识一个记录,称为关键字项。该数据项的值称为关键字(Key)。在不易产生混淆时,本章中将关键字项简称为关键字。 排序 所谓排序(Sort),就是要整理文件中的记录,使它们按关键字递增(或递减)次序重新排列。 排序方法的稳定性在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则称该排序方法是稳定的;否则,若具有相同关键字的记录之间的相对次序发生变化,则称该排序方法是不稳定的。 排序方法的分类 按是否涉及数据的内、外存交换分类: 外排序、内排序。 按策略划分内部排序方法: 插入排序、选择排序、交换排序、归并排序和基数排序等。 排序算法性能评价 评价排序算法好坏的标准主要有两条: (1)执行算法所需的时间; (2)执行算法所需的辅助空间。 9.2.1 直接插入排序 例9.1 直接插入排序举例 [初始关键字] [49] 38 65 97 76 13 27 49 j=2 (38) [38 49] 65 97 76 13 27 49 j=3 (65) [38 49 65] 97 76 13 27 49 j=4 (97) [38 49 65 97] 76 13 27 49 j=5 (76) [38 49 65 76 97] 13 27 49 j=6 (13) [13 38 49 65 76 97] 27 49 j=7 (27) [13 27 38 49 65 76 97] 49 j=8 (49) [13 27 38 49 49 65 76 97] 监视哨R[0] 图9.1 直接插入排序过程示例 直接插入排序算法由两重循环组成,对于有n个记录的排序,内循环表明完成一趟排序所需进行的记录关键字间的比较和记录的后移。 若初始时关键字递增有序,这是最好情况。每一趟排序中仅需进行一次关键字的比较,所以总的比较次数为n-1。在while循环之前和之中,至少要移动记录两次,所以总的比较次数为2(n-1)。 若初始时关键字递减有序,这是最坏情况。这时的记录比较和移动次数分别为: 9.2.2 希尔排序 1959年由D.L. Shell提出,又称缩小增量排序(Diminishing-increment sort) 。 基本思想:在直接插入排序中,只比较相邻的结点,一次比较最多把结点移动一个位置。如果对位置间隔较大距离的结点进行比较,使得结点在比较以后能够一次跨过较大的距离,这样就可以提高排序的速度。 希尔排序的基本过程 希尔排序示例 ?[初始关键字] 49 38 65 97 76 13 27 49 55 04 ? ? (增量为5) ? 一趟排序结果: 13 27 49 55 04 49 38 65 97 76 ? ? (增量为3) 二趟排序结果: 13 04 49 38 27 49 55 65 97 76 (增量为1) 三趟排序结果: 04 13 27 38 49 49 55 65 76 97 图9.2 希尔排序过程示例 希尔排序中增量di的取法 Shell最初的方案是d1 = n/2, di+1 = di /2,直到dt =1。 Knuth的方案是di+1 = di /3+1。 其它方案有:都取奇数为好;或di互质为好等等。 希尔排序的算法分析 对希尔排序的复杂度的分析很困难,在特定情况下可以准确地估算关键字的比较和记录移动次数,但是考虑到与增量之间的依赖关系,并要给出完整的数学分析,目前还做不到。 Knuth的统计结论是,平均比较次数和记录平均移动次数在n1.25 与1.6n1.25之间。 希尔排序的稳定性 希尔排序是一种不稳定的排序方法。见前例,未排序前,25在25* 之前,希尔排序完成后, 25在25* 之后,这就说明希尔排序是不稳定的。 9.3 交换排序 9.3.1 冒泡排序 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是

文档评论(0)

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

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

1亿VIP精品文档

相关文档