问题
给你1个文件bigdata,大小4663M,5亿个数,文件中的数据随机,如下一行一个整数:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
6196302 3557681 6121580 2039345 2095006 1746773 7934312 2016371 7123302 8790171 2966901 ... 7005375 |
现在要对这个文件进行排序,怎么搞?
内部排序
先尝试内排,选2种排序方式:
3路快排:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
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 + (">,low,low + gap,low + (="crayon-5812fcb1902a2415571474" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always" style=" margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;">
现在要对这个文件进行排序,怎么搞? 内部排序 先尝试内排,选2种排序方式: 3路快排:
|