多路歸併排序

在數據結構的課程中,我們都學習過歸併排序,當時的歸併排序都是採用二路歸併的;但是在外部排序中,一般會採用多路歸併;因爲經典的二路歸併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)

發佈了65 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章