原文:http://blog.sina.com.cn/s/blog_62186b4601019uz1.html
我们一般提到排序都是指内排序,比如快排,堆排序,归并排序等,所谓内排序就是能把所有待排序的数据外进内存之中,比如,一个数组之中。但是如果文件太大,文件中的所有数据不能一次性的放入内存之中,快排,堆排序,归并排序等内排序就无法工作了。
该算法分两个阶段:
阶段一:把原始数据分成M段,每次读取一段,存入一个数组,使用内排序算法对这一段数据进行排序,然后将排完序的数据写入一个临时文件。假定最大数组规模为10万个int型值,则每个临时文件中保存着10万个有序的int型值。我们用S1、S2、.....Sk表示这些临时文件,其中最后的一个数据段Sk,包含的数据个数可能不足10万。
阶段二:将每对有序数据段(比如S1跟S2、S3跟S4....)合并为一个大的有序的数据段,将其存入一个新的临时文件。重复此过程,直至只剩下一个数据段。
实现阶段一:
阶段一代码如下:
实现阶段二:
下面是合并所有数据段的代码:
完整的实现代码详见:http://www.oschina.net/code/snippet_176897_13955
(1)int numberOfSegments =initializeSegments(MAX_ARRAY_SIZE, "largedata.dat", "f1.dat");
从原文件中创建初始数据段,并将有序数据段存入文件f1.dat中。
(2)merge(numberOfSegments, MAX_ARRAY_SIZE, "f1.dat", "f2.dat", "f3.dat");
将f1中的文件合并到f3中,利用f2做辅助。函数merge递归的调用多次,完成多个合并操作。每个步骤将numberOfSegments减少一半,而将每个数据段的大小增至一倍。完成一个合并操作后,下一个合并步骤中将f3中的新数据段合并至f2中,用f1做辅助。因此新调用的合并函数应该为:
merge((numberOfSegments + 1) / 2, segmentSize * 2, f3, f1, f2);
递归函数merge当numberOfSegments变为1时终止,在此情况下,f1包含排好序的数据。将f1复制到sortedlargedata.dat。
外排序分析: