第9章-排序精选.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文档。上传文档
查看更多
9.6 基数排序 3)第3趟按k[1]排序(分配、收集) F 328 134 035 143 258 659 ^ e[0] e[1] e[2] e[3] e[4] e[5] e[6] e[7] e[8] e[9] f[0] f[1] f[2] f[3] f[4] f[5] f[6] f[7] f[8] f[9] 328 134 143 035 258 659 收集 F 035 134 143 258 328 659 ^ (按k[1]k[2]k[3]有序) 9.6 基数排序 (3) LSD算法描述 (略) (4) LSD算法分析 设待排序链表长度为n,key的位数为d,基数为r。 共进行了d 趟的“分配”与“收集”。每趟分配与收集与n、r有关。 基数排序的时间复杂度为O(d(n+r))。 基数排序属于稳定排序。 9.7 各种内排序算法的比较讨论 1. 稳定性比较 除Shell排序外的所有插入排序、冒泡排序、归并排序与基数排序是稳定排序; 直接选择排序、Shell排序、快速排序与堆排序是非稳定排序。 多数情况下记录按某个key排序,所用的排序方法是否稳定没有关系。但若记录要按多个key依次进行排序,则需要选择稳定的排序方法。 2. 时间性能比较 O(n2):除Shell排序外的所有插入排序、冒泡排序、直接选择排序; O(nlog2n):快速排序、堆排序、归并排序、基数排序; 一般结论:快速排序最好。但在最差情况下,快速排序不如堆排序和归并排序;当n很小时,快速排序是很差的; 直接插入排序的最佳时间复杂度是O(n)。当序列中的记录基本有序或n较小时,是最佳的排序方法。 9.7 各种内排序算法的比较讨论 3. 说明 不存在绝对最好的排序方法。在实际应用中,应根据具体情况选择合适的排序方法,甚至多种方法的结合。 例如:快速排序和直接插入排序的结合。经验表明:最好的组合方式是当n9(n是序列长度)时使用直接插入排序。 已得到证明的结论:基于比较的排序算法(基数排序不是!)的最差执行时间一定≥O(nlog2n)。 9.8 外排序概述 外排序(External Sort): 当待排序文件的记录数很多,无法一次将所有记录都放到内存中进行排序。此时需要外排序技术。 外排序要考虑的主要问题: 使I/O次数尽可能少。即每次访问尽可能多的数据; 影响外排序效率的主要因素是对文件的I/O时间,因此要有效利用内存缓冲区。 根据文件的存储介质,外排序可分为: 磁盘排序。磁盘的特点是分块、随机访问; 磁带排序。磁带的特点是顺序访问,通常用于备份和归档,不再用于联机处理。 下面只简单讨论磁盘排序。 9.8 外排序概述 若操作系统支持虚拟存储器,一种简单的外排序方法:将整个文件读入虚拟内存,然后用内排序方法。 但存在下列问题: 虚拟内存的大小可能小于文件长度; 不可能比设计一种新的以磁盘访问次数最小化为目标的算法更有效。 常用的方法:归并,如二路归并 ① 分段读入文件的各部分到内存,在内存对其排序,将结果(归并段)写回文件; ② 将各归并段按二路归并方法逐步归并到一起写回文件。 9.8 外排序概述 例如: 初始归并段: m1 m2 m3 m4 m5 m6 第1趟归并: m1’ m2’ m3’ 第2趟归并: m1’’ m3’ 第3趟归并: 排好序的文件F 关键: 初始归并段的大小; 输入和输出缓冲区的大小。 排序 直接插入 折半插入 链表插入 Shell 排序 插入排序 选择排序 直接选择 堆选择 快速排序 冒泡排序 交换排序 算法、 算法分析 基数排序 归并排序 排序概述 9.9 小结 void QuickSort (sqfile *F) //对序列F快速排序的递归算法 { int i, low, high; low = 1; high = F-len; if (low = high) return; i = qkpass(F, low, high); //对当前子表的一趟快速排序 QuickSort(F, low, i - 1); QuickSort(F, i + 1, high); } 快速排序 typedef

文档评论(0)

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

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

1亿VIP精品文档

相关文档