在數據結構的課程中,我們都學習過歸併排序,當時的歸併排序都是採用二路歸併的;但是在外部排序中,一般會採用多路歸併;因爲經典的二路歸併IO的次數要比多路歸併多很多,所以對算法的性能影響會很大;下面是筆者實現的一個多路歸併排序算法。
import java.util.ArrayList;
public class MultipleMerge {
public static void main(String[] args) {
int[] a = {1, 4, 7, 9, 10};
int[] b = {-1, 5, 23, 89};
int[] c = {-22, 2, 3, 90};
int[] d = {-100, -80, 100, 345, 1000};
ArrayList<Integer> result = new ArrayList<Integer>();
multipleMerge(result, a, b, c, d);
System.out.println(result);
}
public static void multipleMerge(ArrayList<Integer> result, int[] ... arrays){
if(result == null)
return;
int[] num = new int[arrays.length];
int[] idx = new int[arrays.length];
for(int i = 0; i < arrays.length; i++){
if(arrays[i] == null || arrays[i].length == 0)
return;
num[i] = arrays[i][0];
idx[i] = 0;
}
int n = arrays.length;
while(n > 0){
int i = getMinIndex(num);
result.add(num[i]);
if(idx[i] == arrays[i].length-1){
n--;
num[i] = Integer.MAX_VALUE;
}else{
idx[i]++;
num[i] = arrays[i][idx[i]];
}
}
}
private static int getMinIndex(int[] num){
int min = Integer.MAX_VALUE;
int index = -1;
for(int i = 0; i < num.length; i++){
if(num[i] < min){
min = num[i];
index = i;
}
}
return index;
}
}
上述代碼其實還可以進一步優化,在getMinIndex時,時間複雜度是O(N),但如果採用敗者樹,則時間複雜度可以提高到log(N)