假设给你一个问题:怎样给一个磁盘排序?我们首要做的就是分析该问题,弄清问题的正确的具体描述(尤其在面试的时候很重要)。
问题的准确描述:1、输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10000000。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数关联;2、输出:按升序排列的输入整数的列表;3、约束:最多有大约1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒钟就不需要进一步优化了
一、一般的磁盘文件排序
1、内排序
由于要求的可用内存为1MB,那么每次可以在内存中对250K的数据进行排序,然后将有序的数写入硬盘。那么10M的数据需要循环40次,最终产生40个有序的文件。
2、多路归并排序
(1)将每个文件最开始的数读入(由于有序,所以为该文件最小数),存放在一个大小为40的first_data数组中;
(2)选择first_data数组中最小的数min_data,及其对应的文件索引index;
(3)将first_data数组中最小的数写入文件result,然后更新数组first_data(根据index读取该文件下一个数代替min_data);
(4)判断是否所有数据都读取完毕,否则返回(2)。
显然上述方法的时间可能需要几分钟,甚至几十分钟,下面提供一种高效的方法ÿ