大文件,5亿整数,怎么排?
最近,面试头条,面试官一上来,就问了我这么一个问题,我一脸懵逼,决定记录一下。
问题
给你1个文件bigdata,大小4663M,5亿个数(对的,你没听错,就是5亿),文件中的数据随机,如下一行一个整数:
6196302
3557681
6121580
2039345
2095006
1746773
7934312
2016371
7123302
8790171
2966901
...
7005375
现在要对这个文件进行排序,怎么搞?
内部排序
先尝试内排,选2种排序方式。
3路快排:
private final int cutoff = 8;
public <T> void perform(Comparable<T>[] a) {
perform(a, 0, a.length - 1);
}
private <T> int median3(Comparable<T>[] a, int x, int y, int z) {
if (lessThan(a[x], a[y])) {
if (lessThan(a[y], a[z])) {
return y;
} else if (lessThan(a[x], a[z])) {
return z;
} else {
return x;
}
} else {
if (lessThan(a[z], a[y])) {
return y;
} else if (lessThan(a[z], a[x])) {
return z;
} else {
return x;
}
}
}
private <T> void perform(Comparable<T>[] a, int low, int high) {
int n = high - low + 1;
// 当序列非常小,用插入排序
if (n <= cutoff) {
InsertionSort insertionSort = SortFactory.createInsertionSort();
insertionSort.perform(a, low, high);
// 当序列中小时,使用median3
} else if (n <= 100) {
int m = median3(a, low, low + (n >>> 1), high);
exchange(a, m, low);
// 当序列比较大时,使用ninther
} else {
int gap = n >>> 3;
int m = low + (n >>> 1);
int m1 = median3(a, low, low + gap, low + (gap << 1));
int m2 = median3(a, m - gap, m, m + gap);
int m3 = median3(a, high - (gap << 1), high 