排序算法-歸併排序

6 歸併排序

基本思想

歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題而後遞歸求解,而治(conquer)的階段則將分的階段獲得的各答案"修補"在一塊兒,即分而治之)。html

操做方法

EBRpaF.md.png
EBR954.md.png

實現

/**
 * 歸併排序
 * 簡介:將兩個(或兩個以上)有序表合併成一個新的有序表 即把待排序序列分爲若干個子序列,每一個子序列是有序的。而後再把有序子序列合併爲總體有序序列
 * 時間複雜度爲O(nlogn)
 * 穩定排序方式
 * @param a 待排序數組
 */
private void mergeSort(int[] a, int low, int high){
    if(low < high){
        int mid = (low + high) >>> 1;
        mergeSort(a, low, mid);
        mergeSort(a,mid+1, high);
        merge(a, low, mid, high);
    }
}

/**
 * 將數組中low到high位置的數進行排序
 * @param a 待排序數組
 * @param low 待排的開始位置
 * @param mid 待排中間位置
 * @param high 待排結束位置
 */
private void merge(int[] a, 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(a[i] < a[j]){
            temp[k++] = a[i++];
        } else {
            temp[k++] = a[j++];
        }
    }
    // 把左邊剩餘的移到數組中
    while (i <= mid){
        temp[k++] = a[i++];
    }
    // 把右邊剩餘的移到數組中
    while (j <= high){
        temp[k++] = a[j++];
    }
    // 把新數組中的數覆蓋原數組
    for(int k2 = 0; k2 <temp.length; k2++){
        a[k2+low] = temp[k2];
    }
}

@Test
public void mergeTest(){
    int[] a={7,5,3,2,9,10,8,4,6,1};
    mergeSort(a, 0, a.length-1);
    System.out.println(Arrays.toString(a));
}
複製代碼

參考:
必須知道的八大種排序算法【java實現】(二) 選擇排序,插入排序,希爾算法【詳解】
圖解排序算法(四)之歸併排序java

相關文章
相關標籤/搜索