- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构——第10章外排序(C#)
* 外排序的基本方法是归并排序法。它分为以下两个步骤: (1)生成若干初始归并段(顺串):这一过程也称为文件预处理: ① 把含有n个记录的文件,按内存大小分成若干长度为L的子文件(归并段); ② 分别将各子文件(归并段)调入内存,采用有效的内排序方法排序后送回外存。 (2)多路归并:对这些初始归并段进行多遍归并,使得有序的归并段逐渐扩大,最后在外存上形成整个文件的单一归并段,也就完成了这个文件的外排序。 10.1 外排序概述 第10章 外排序 内存 abc.dat abc1.dat abc2.dat … abcn.dat 内存 abc1.dat abc2.dat … abcn.dat abc.dat 第1步 第2步 有序 均有序 某内排序算法 某排序算法:只能是归并算法 10.2 磁盘排序 磁盘排序过程如下: 磁盘是一种直接存取设备。 文件Fin.dat (含4500个记录) 容量为750个记录 产生6个长度为750个记录的有序文件F1~F6。 第一阶段 通过一个例子来说明磁盘排序的过程。设有一个文件Fin.dat,内含4500个记录:A1,A2,…,A4500,现在要对该文件进行排序,但可占用的内存空间至多只能对750个记录进行排序。输入文件(被排序的文件)放在磁盘上,页块长为250个记录。 某种内排序方法 可用内存空间大小为750个记录 第二阶段:归并过程 10.2.1 初始归并段的生成 采用上一章中介绍的常规内排序方法,可以实现初始归并段的生成,但所生成的归并段的大小正好等于一次能放入内存中的记录个数。显然存在局限性。 如果采用前面所述的败者树方法,可以使初始归并段的长度增大。这里介绍一种称为置换-选择排序方法用于生成初始归并段。 置换-选择排序生成初始归并段时,内部排序基于选择排序,同时在此过程中伴随记录的输入和输出,生成的初始归并段长度超过平均数,且长度可能各不相同。 (1)从待排文件Fin中按内存工作区WA的容量w读入w个记录。设归并段编号i=1。 (2)使用败者树从WA中选出关键字最小的记录Rmin。 (3)将Rmin记录输出到Fout中,作为当前归并段的一个成员。 (4)若Fin不空,则从Fin中读入下一个记录x放在Rmin所在的工作区位置代替Rmin。 (5)在工作区中所有大于或等于Rmin的记录中选择出最小记录作为新的Rmin,转(3),直到选不出这样的Rmin。 (6)设i=i+1,开始一个新的归并段。 (7)若工作区已空,则初始归并段已全部产生;否则转(2)。 例10.1 设磁盘文件中共有18个记录,记录的关键字分别为: {15,4,97,64,17,32,108,44,76,9,39,82,56,31,80,73,255,68} 若内存工作区可容纳5个记录,用置换-选择排序可产生几个初始归并段,每个初始归并段包含哪些记录? 归并段1:{4,15,17,32,44} 44(i=1) 108,76,97,64,44 76 归并段1:{4,15,17,32} 32(i=1) 108,32,97,64,44 44 归并段1:{4,15,17} 17(i=1) 108,32,97,64,17 108 归并段1:{4,15} 15(i=1) 15,32,97,64,17 32 归并段1:{4} 4(i=1) 15,4,97,64,17 15,4,97,64,17 输出之后的初始归并段状态 Rmin 内存工作区状态 读入记录 初始归并段的生成过程 输出之后的初始归并段状态 Rmin 内存工作区状态 读入记录 归并段1: {4,15,17,32,44,64,76,82,97,108} 108(i=1) 108,56,31,39,9 31 归并段1:{4,15,17,32,44,64,76,82,97} 97(i=1) 108,56,97,39,9 56 归并段1:{4,15,17,32,44,64,76,82} 82(i=1) 108,82,97,39,9 82 归并段1:{4,15,17,32,44,64,76} 76(i=1) 108,76,97,39,9 39 归并段1: {4,15,17,32,44,64} 64(i=1) 108,76,97,64,9 9 输出之后的初始归并段状态 Rmin 内存工作区状态 读入记录 归并段2:{9,31,39,56,68} 68(i=2) 80, ∞,255,68,73 ?- 归并段2:{9,31
文档评论(0)