题目:文件存储在磁盘上,假设内存容量为m,待排序文件容量为M,M>m
步骤:
1.生成顺串
每次读入m长度文件内容,使用内部排序,有序后输出到文件,总共生成大约M/m个中转文件
2.归并顺串
使用M/m路的归并将M/m个文件的内容归并,步骤如下:
产生M/m+1个缓冲区,M/m个为每个输入文件的缓冲区,一个为输出文件缓冲区,然后M/m路归并(归并过程如图所示)写入输出缓冲区,输出缓冲区满则写文件,输入缓冲区空则再次读入。一般归并不会一次对所有的中转文件归并,而是执行多次k路归并。
分析:k路归并,每次需要比较遍历k个数选择出最小的值复杂度为O(n)
生成顺串的优化
使用选择置换算法生成顺串可以在有限的内存下生成大概两倍于内存的顺串,因此会产生更少的待归并中转文件。
选择置换算法:
假设:内存容量为m,待排序文件容量为M,从小到大排序
(1)从输入文件读取容量m的内容将可用内存填满
(2)读入内容构建最小堆
(3)重复以下步骤到堆大小变为0:
a. 把根结点的数字A