《数据结构C++版第二版》第10章.ppt

* * 第10章 外排序 本章学习内容 10.1 外排序的基本概念 10.2 多路平衡归并的实现 10.1 外排序的基本概念 内排序是直接在计算机内存中进行的。若要排序的数据一次可以装入计算机内存,则对这批数据的排序可以直接在内存中完成,因而,利用前面的内排序就可以了。若要排序的数据量很大,内存中一次装不下,要将数据放入外存(磁带、磁盘),这时,用内排序达不到我们的要求,必须用到本章介绍的外排序。而外排序是利用内存、外存来共同完成的。 外排序可以看成由两个独立的阶段组成。首先,按可用内存的大小,将外存上含n个记录的文件分成若干长度为m的子文件或段,依次读入内存并用上一章的内排序方法(一般用堆排序实现)完成每段的排序,再保存到外存;然后,对这些段进行归并,使归并段逐渐由小到大,直到得到整个文件有序为止。第一阶段就是上一章介绍的内排序方法,因此,本章主要讨论第二阶段的归并实现。 第二阶段的归并有二路平衡归并和多路平衡归并。下面先给出例子来说明,具体实现方法见下一节。 假设有一个含10000个记录的文件,内存一次只能装入1000个记录,则可以将文件分成10段,每段含1000个记录。首先通过10次内部排序得到10个初始归并段R1~R10,其中每一段都含有1000个记录(已经有序),再保存到外存中,然后可以利用二路平衡归并使整个文件有序。二路平衡归并见图10-1。 图10-1 二路平衡归并过程 若对刚才的文件,首先通过10次内部排序得到10个初始归并段R1~R10,其中每一段都含有1000个记录,再保存到外存中,然后也可以利用五路平衡归并使整个文件有序,五路平衡归并见图10-2。 图10-2 五路平衡归并过程 一般情况下,外排序所需总的时间=内排序所需时间(生成初始归并段)m*tIS+外存信息读写的时间d*tIO+平衡归并所需的时间s*utmg。 m为初始归并段的个数,tIS是得到一个初始归并段进行内排序所需的时间均值;d为总的读写次数,tIO是进行一次外存读写时间的均值;s为归并的趟数,utmg是对u个记录进行内部归并所需时间。 对同一文件而言,假设有m个初始归并段,进行k路平衡归并,归并的趟数可以表示为s=?logkm? 。若增加k或减少m则可以减少s,外排序所需总的时间就可以减少。 10.2 多路平衡归并的实现 10.2.1 初始归并段的生成 假设初始待排文件为输入文件FI,初始归并段文件为输出文件FO,内存工作区为WA,FO和WA的初始状态为空,并假设内存工作区WA的容量为W个记录,则生成初始归并段的操作过程为: (1) 从FI输入W个记录到工作区WA。 (2) 从WA中选关键字最小的记录,记为MINKEY。 (3) 将MINKEY记录输出到FO中。 (4) 若FI不空,则从FI输入下一个记录到WA中。 (5) 从WA中选比MINKEY大的所有关键字中选最小的关键字,作为新的MINKEY。 (6) 重复(3)~(5),直到WA中选不出新的MINKEY为止,由此得到一个初始归并段。 (7) 重复(2)~(6)直到WA为空。则得到全部初始归并段。 例如,给定初始文件含有24个记录,对应的关键字分别为:51,49,39,46,38,29,14,61,15,30,1,48,52,3,63,27,4,13,89,24,46,58,33,76。利用上面的方法生成初始归并段过程如下表(假设内存工作区WA的容量为6个记录)。 3,63,27,4,13,89,24,46,58,33,76 48,1,15,30,52,14 29,38,39,46,49,51,61 52,3,63,27,4,13,89,24,46,58,33,76 48,1,15,30,61,14 29,38,39,46,49,51 48,52,3,63,27,4,13,89,24,46,58,33,76 51,1,15,30,61,14 29,38,39,46,49 1,48,52,3,63,27,4,13,89,24,46,58,33,76 51,49,15,30,61,14 29,38,39,46 30,1,48,52,3,63,27,4,13,89,24,46,58,33,76 51,49,15,46,61,14 29,38,39 15,30,1,48,52,3,63,27,4,13,89,24,46,58,33,76 51,49,39,46,61,14 29,38 61,15,30,1,48,52,3,63,27,4,13,89,24,46,58,33,76 51,49,39,46,38,14 29 14,61,15,30,1,48,52,3,63,27,4,13,89,24,46,58,33,76 51,49,39,46,38,29 第一归并段 51,

文档评论(0)

1亿VIP精品文档

相关文档