数据结构第十二章外排序.ppt

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

第12章 外 排 序 ;12.1 外排序概述 文件存储在外存上,因此外排序方法与各种外存设备的特征有关,外存设备大体上可分为两类,一类是顺序存取设备,例如磁带,另一类是直接存取设备,例如磁盘,其结构如下图所示。; 外排序的基本方法是归并排序法。它分为以下两个步骤: (1) 生成若干初始归并段(顺串),这一过程也称为文件预处理: ① 把含有n个记录的文件,按内存大小分成若干长度为L的子文件(段); ② 分别将各子文件(段)调入内存,采用有效的内排序方法排序后送回外存。 (2) 多路归并:对这些初始归并段进行多遍归并,使得有序的归并段逐渐扩大,最后在外存上形成整个文件的单一归并段,也就完成了这个文件的外排序。;12.2 磁盘排序 12.2.1 磁盘排序过程 磁盘是直接存取设备,读/写一个数据块的时间与当前读/写头所处的位置关系不大。 我们通过一个例子来说明磁盘排序的过程。设有一个文件,内含4500个记录:A1,A2,…,A4500,现在要对该文件进行排序,但可占用的内存空间至多只能对750个记录进行排序。输入文件(被排序的文件)放在磁盘上,页块长为250个记录。排序过程可如下进行:;6个归并段的归并过程 ;12.2.2 多路平衡归并 上图所示的归并过程基本上是2路平衡归并的算法。一般说来,如果初始归并段有m个,那么这样的归并树就有?log2m?+1层,要对数据进行?log2m?遍扫描。采用k路平衡归并时,则相应的归并树有?logkm?+1层,要对数据进行?logkm?遍扫描。; 做内部归并时,在k个记录中选择最小者,需要顺序比较k-1次。每趟归并u个记录需要做(u-1)*(k-1)次比较,s趟归并总共需要的比较次数为: s*(u-1)*(k-1)=?logkm?*(u-1)*(k-1) =?log2m?*(u-1)* (k-1)/?log2k? 其中,?log2m?*(u-1)在初始归并段个数m与记录个数u一定时是常量,而(k-1)/?log2k?在k增大时趋于无穷大。因此,增大归并路数k,会使内部归并的时间增大。若k增大到一定的程度,就会抵消掉由于减少读写磁盘次数而赢得的时间。;下面讨论利用败者树实现多路平衡归并。 败者树是一棵有k个叶结点的完全二叉树,叶子结点存储记录,非叶结点可由关键字和它对应的记录地址构成,为讨论方便起见,设非叶结点的结构为: 关键字,输入有序段的路号 对k个输入有序段进行k路平衡归并的方法如下: (1) 取每个输入有序段的第一个记录作为败者树的叶子结点,建立初始败者树:两两叶结点进行比较,在双亲结点中记录比赛的败者(关键字较大者),而让胜者去参加更高一层的比赛,如此在根结点之上胜出的“冠军”是关键字最小者。; (2) 胜出的记录写至输出归并段,在对应的叶结点处,补充其输入有序段的下一个记录,若该有序段变空,则补充一个大关键字(比所有记录关键字都大,设为kmax)的虚记录。 (3) 调整败者树,选择新的关键字最小的记录:从补充记录的叶结点向上和双亲结点的关键字比较,败者留在该双亲结点,胜者继续向上,直至树根的双亲。 (4) 若胜出的记录关键字等于kmax,则归并结束;否则转(2)继续。; 例如,设有5个初始归并段,它们中各记录的关键字分别是: R1:{17,21,∞} R2:{5,44,∞} R3:{10,12,∞} R4:{29,32,∞} R5:{15,56,∞} 其中,∞是段结束标志。利用败者树进行5路平衡归并排序的过程如下图所示。 ;; 从上例看到,k路平衡归并的败者树的深度为?log2k?,在每次调整找下一个具有最小关键字记录时,最多做?log2k? 次关键字比较。因此,利用败者树在k个记录中选择最小者,只需要进行O(?log2k?)次关键字比较,这时归并总共需要的比较次数为: s*(u-1)* ?log2k?=?logkm?*(u-1)* ?log2k? =?log2m?*(u-1)* ?log2k?/?log2k? =?log2m?*(u-1); 这样,关键字比较次数与k无关,总的内部归并时间不会随k的增大而增大。因此,只要内存空间允许,增大归并路数k,将有效地减少归并树的深度,从

文档评论(0)

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

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

1亿VIP精品文档

相关文档