經常使用排序算法(七)——歸併排序

        歸併排序是另外一種不一樣的排序方法,由於歸併排序使用了遞歸分治的思想,因此理解起來比較容易。其基本思想是,先遞歸劃分子問題,而後合併結果。把待排序列當作由兩個有序的子序列,而後合併兩個子序列,而後把子序列當作由兩個有序序列。。。。。倒着來看,其實就是先兩兩合併,而後四四合並。。。最終造成有序序列。空間複雜度爲O(n),時間複雜度爲O(nlogn)。 數組

        舉個栗子:指針

圖片描述

        實現代碼:code

public class MergeSort { 
	public static void mergeSort(int[] arr) { 
		mSort(arr, 0, arr.length-1); 
	} 
	
	/** 
	* 遞歸分治 
	* @param arr 待排數組 
	* @param left 左指針 
	* @param right 右指針 
	*/ 
	public static void mSort(int[] arr, int left, int right) { 
		if(left >= right) 
			return ; 
		int mid = (left + right) / 2; 
		mSort(arr, left, mid); //遞歸排序左邊 
		mSort(arr, mid+1, right); //遞歸排序右邊 
		merge(arr, left, mid, right); //合併 
	} 
	
	/** 
	* 合併兩個有序數組 
	* @param arr 待合併數組 
	* @param left 左指針 
	* @param mid 中間指針 
	* @param right 右指針 
	*/ 
	public static void merge(int[] arr, int left, int mid, int right) {
		//[left, mid] [mid+1, right] 
		int[] temp = new int[right - left + 1]; //中間數組 
		
		int i = left; 
		int j = mid + 1; 
		int k = 0; 
		while(i right) { 
			if(arr[i] arr[j]) { 
				temp[k++] = arr[i++]; 
			} 
			else { 
				temp[k++] = arr[j++]; 
			} 
		} 
		
		while(i mid) { 
			temp[k++] = arr[i++]; 
		} 
		
		while(j right) { 
			temp[k++] = arr[j++]; 
		} 
		
		for(int p=0; p) { 
			[left + p] = temp[p]; 
		} 
	}
}
相關文章
相關標籤/搜索