美团电话面试题:10亿个short类型的数在内存有限的机器上排序。
1.计数排序
第一时间想到的办法就是计数排序,short类型表示范围只有65535个数,这是我认为的最优的解法,毕竟一趟遍历就可完成任务,时间复杂度O(n),占用空间也很少,只需要一个65535长的long类型数组即可。但是,面试官并不买账,他一直引导我用分治法的思路来解决。
2.大数据分块排序,再合并
面试官提示到分治法之后,我只说到了把超大文件分成小段排序,然而怎么合并却并没有答到点子上。结束之后,在博客上搜了一下,这位同学(http://blog.youkuaiyun.com/mxiangjian/article/details/52107727)给出了思路,很清晰,废话不多说,代码贴出。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;
/**
* @author mr_cuber
*
* @date 2017年6月18日 下午2:25:25
*/
public class OuterSort {
public static void main(String[] args) throws FileNotFoundException {
long numOfNumbers = 50000000L;
int pieces = 100;
//均为相对路径,且desFolder手动创建
String sourceFile = "data.txt";
String desFolder = "pieces_small";
String desFile = "dat