有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能使用内部排序了(这里作一下说明,其实全部的排序都是在内存中作的,这里说的内部排序是指待排序的内容在内存中就能够完成,而外部排序是指待排序的内容不能在内存中一会儿完成,它须要作内外存的内容交换),外部排序常采用的排序方法也是归并排序,这种归并方法由两个不一样的阶段组成:算法
一、采用适当的内部排序方法对输入文件的每一个片断进行排序,将排好序的片断(成为归并段)写到外部存储器中(一般由一个可用的磁盘做为临时缓冲区),这样临时缓冲区中的每一个归并段的内容是有序的。spa
二、利用归并算法,归并第一阶段生成的归并段,直到只剩下一个归并段为止。blog
例如要对外存中4500个记录进行归并,而内存大小只能容纳750个记录,在第一阶段,咱们能够每次读取750个记录进行排序,这样能够分六次读取,进行排序,能够获得六个有序的归并段,以下图:排序
每一个归并段的大小是750个记录,记住,这些归并段已经所有写到临时缓冲区(由一个可用的磁盘充当)内了,这是第一步的排序结果。内存
完成第二步该怎么作呢?这时候归并算法就有用处了,算法描述以下:同步
一、将内存空间划分为三份,每份大小250个记录,其中两个用做输入缓冲区,另一个用做输出缓冲区。首先对Segment_1和Segment_2进行归并,先从每一个归并段中读取250个记录到输入缓冲区,对其归并,归并结果放到输出缓冲区,当输出缓冲区满后,将其写道临时缓冲区内,若是某个输入缓冲区空了,则从相应的归并段中再读取250个记录进行继续归并,反复以上步骤,直至Segment_1和Segment_2全都排好序,造成一个大小为1500的记录,而后对Segment_3和Segment_四、Segment_5和Segment_6进行一样的操做。程序
二、对归并好的大小为1500的记录进行如同步骤1同样的操做,进行继续排序,直至最后造成大小为4500的归并段,至此,排序结束。方法
能够用一个图示表示上述算法的归并效果:im
以上对外部排序如何使用归并算法进行排序进行了简要总结,提升外部排序须要考虑如下问题:d3
一、如何减小排序所需的归并趟数。
二、若是高效利用程序缓冲区,使得输入、输出和CPU运行尽量地重叠。
三、如何生成初始归并段(Segment)和如何对归并段进行归并。