歸併排序

歸併排序 原文連接

歸併排序是創建在歸併操做上的排序算法,採用分治法,經過將已有的子序列合併,獲得徹底有序的序列,即先使每一個子序列有序,在使子序列段間有序,將兩個有序表合成一個有序表,稱爲二路歸併。是一種穩定的排序算法。 算法

思想

分而治之,將大的問題分紅小的區間,進行遞歸求解,而後把小的區間合併。數組

排序流程

動圖

代碼

public static void mergeSort(int[] arr) {
    sort(arr, 0, arr.length - 1);
}

public static void sort(int[] arr, int left, int right) {
    if(left == right) {
        return;
    }
		//找到中間位置下標
    int mid =(left+right)/2;
		//左路遞歸
    sort(arr, left, mid);
		//右路遞歸
    sort(arr, mid + 1, right);
		//合併數組
    merge(arr, left, mid, right);
}

public static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = 0;
    int p1 = left;
    int p2 = mid + 1;
    // 比較左右兩部分的元素,哪一個小,把那個元素填入temp中
    while(p1 <= mid && p2 <= right) {
        temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
    }
    // 上面的循環退出後,把剩餘的元素依次填入到temp中
    // 如下兩個while只有一個會執行
    while(p1 <= mid) {
        temp[i++] = arr[p1++];
    }
    while(p2 <= right) {
        temp[i++] = arr[p2++];
    }
    // 把最終的排序的結果複製給原數組
    for(i = 0; i < temp.length; i++) {
        arr[left+ i] = temp[i];
    }
}
複製代碼

複雜度

  • 時間複雜度:O(nlogn)
  • 空間複雜度:O(N),歸併排序須要一個與原數組相同長度的數組作輔助來排序
  • 穩定性:歸併排序是穩定的排序算法,temp[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];這行代碼能夠保證當左右兩部分的值相等的時候,先複製左邊的值,這樣能夠保證值相等的時候兩個元素的相對位置不變。

更多推薦

快速排序詳解bash

冒泡排序詳解ui

選擇排序詳解spa

插入排序詳解3d

堆排序詳解code

相關文章
相關標籤/搜索