数据结构与算法分析第九章排序.ppt

  1. 1、本文档共212页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
比较排序算法的下界log(n!) log((n/2)n/2)log(n!)log(nn) (n/2)log(n/2)log(n!)nlogn (n/2)log(n/2)=(n/2)(logn-1) =(n/2)logn-n/2=O(nlogn) log(n!)=O(nlogn) 外 排 序 当对象以文件形式存放于磁盘上的时候,通常是按物理块存储的。 物理块也叫做页块,是磁盘存取的基本单位。 当待排序的对象数目特别多时,在内存中不能一次处理。必须把它们以文件的形式存放于外存,排序时再把它们一部分一部分调入内存进行处理。这样,在排序过程中必须不断地在内存与外存之间传送数据。这种基于外部存储设备(或文件)的排序技术就是外排序。 外排序的基本过程 每个页块可以存放几个对象。操作系统按页块对磁盘上的信息进行读写。 本节所指的磁盘是由若干片磁盘组成的磁盘组,各个盘片安装在同一主轴上高速旋转。各个盘面上半径相同的磁道构成了柱面。各盘面设置一个读写磁头,它们装在同一动臂上,可以径向从一个柱面移到另一个柱面上。 为了访问某一页块,先寻找柱面,移动臂使读写磁头移到指定柱面上:寻查 (seek)。 再根据磁道号(盘面号)选择相应读写磁头,等待指定页块转到读写磁头下:等待(latency)。因此, 在磁盘组上存取一个页块的时间: tio=tseek+tlatency+trw 基于磁盘进行的排序多使用归并排序方法。其排序过程主要分为两个阶段: 第一个阶段建立用于外排序的内存缓冲区。根据它们的大小将输入文件划分为若干段,用某种内排序方法对各段进行排序。这些经过排序的段叫做初始归并段或初始顺串 (Run)。当它们生成后就被写到外存中去。 第二个阶段仿照内排序中所介绍过的归并树模式,把第一阶段生成的初始归并段加以归并,一趟趟地扩大归并段和减少归并段个数,直到最后归并成一个大归并段(有序文件)为止。 示例:设有一个包含4500个对象的输入文件。现用一台其内存至多可容纳750个对象的计算机对该文件进行排序。输入文件放在磁盘上,磁盘每个页块可容纳250个对象,这样全部对象可存储在 4500 / 250=18 个页块中。输出文件也放在磁盘上,用以存放归并结果。 由于内存中可用于排序的存储区域能容纳750 个对象, 因此内存中恰好能存3个页块的对象。 在外归并排序一开始,把18块对象,每3块一组,读入内存。利用某种内排序方法进行内排序, 形成初始归并段, 再写回外存。总共可得到6个初始归并段。然后一趟一趟进行归并排序。 两路归并排序的归并树 R1 750 R2 750 R3 750 R4 750 R5 750 R6 750 初始 归并段 R12 1500 R34 1500 R56 1500 R1234 3000 R123456 4500 第一趟 归并结果 第二趟 归并结果 第三趟 归并结果 若把内存区域等份地分为 3 个缓冲区。其中的两个为输入缓冲区,一个为输出缓冲区,可以在内存中利用简单 2 路归并函数 merge 实现 2 路归并。 首先, 从参加归并排序的两个输入归并段 R1 和 R2 中分别读入一块,放在输入缓冲区1 和输入缓冲区2 中。然后,在内存中进行2路归并,归并出来的对象顺序存放到输出缓冲区中。 输入缓冲区 2 输入缓冲区 1 输出缓冲区 一般地,若总对象个数为 n,磁盘上每个页块可容纳 b 个对象,内存缓冲区可容纳 i 个页块,则每个初始归并段长度为 len = i * b,可生成 m = ?n / len? 个等长的初始归并段。 在做2路归并排序时,第一趟从 m 个初始归并段得到 ?m/2? 个归并段,以后各趟将从 l (l 1) 个归并段得到 ?l/2? 个归并段。总归并趟数等于归并树的高度 ?log2m?。 根据 2 路归并树, 估计 2 路归并排序时间 tES 的上界为: tES = m*tIS + d*tIO + S*u*tmg 对4500个对象进行排序的例子,各种操作的计算时间如下: 读18个输入块, 内部排序6段, 写18个输出块 =6 tIS+36 tIO 成对归并初始归并段 R1~R6 =36 tIO+4500 tmg 归并两个具有1500个对象的归并段R12和R34 =24 tIO+3000 tmg 最后将 R1234 和 R56 归并成一个归

文档评论(0)

整理王 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档