排序——歸併排序(merge sort)

歸併排序(merge sort):歸併是將兩個或者兩個以上的有序表合併成一個新的有序表。歸併排序使用分而治之的方法進行排序:

  1. 分解:將待排序的n個元素分解成兩個子序列,每個序列包括n/2個元素。
  2. 治理:對每個子序列分別排序。
  3. 合併:將兩個排序好的子序列合併,生成排序結果。

歸併排序的最優時間複雜度、最差時間複雜度和平均時間複雜度均爲O(nlogn)。

歸併排序的空間複雜度爲O(n)。

歸併排序多次進行上述操作,將數組進行分解直到所有的子序列長度爲1,然後依次進行合併,算法時間複雜度爲O(nlogn)。實現方法如下:

public class MergeSort {

	public static void main(String[] args) {
		int[] array = {14,12,15,13,11,16};
		int[] result = sort(array, 0, array.length - 1);
		for(int i:result){
			System.out.println(i);
		}
	}

	public static int[] sort(int[] array, int low, int high) {
		
		int mid = (low + high)/2;
		if(low < high){
			//遞歸排序
			sort(array, low, mid);
			sort(array, mid + 1, high);
			//左右歸併,將兩個有序序列進行合併
			merge(array, low, mid, high);
		}
		return array;
	}

	public static void merge(int[] array, int low, int mid, int high) {
		//臨時開創的新數組,用於存儲合併後的有序數組
		int[] temp = new int[high - low + 1];
		
		int i = low;
		int j = mid + 1;
		int k = 0;
		
		while(i <= mid && j <= high){
			if(array[i] < array[j]){
				temp[k++] = array[i++];
			}
			else{
				temp[k++] = array[j++];
			}
		}
		while(i <= mid){
			temp[k++] = array[i++];
		}
		while(j <= high){
			temp[k++] = array[j++];
		}
		for(int x = 0; x < temp.length; x++){
			array[low + x] = temp[x];
		}
	
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章