歸併排序

1、什麼是歸併排序

歸併排序(MERGE-SORT)是創建在歸併操做上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。算法

2、圖解

歸併排序
先將無序數組分割,通過排序,將兩個有序數組再拼接。數組

3、原理

歸併排序的原理就是合併兩個有序數組。合併兩個有序數組的代碼:ide

private static void merge(int[] a, int left, int mid, int right) {
        int[] tmp = new int[a.length];//輔助數組
        int p1 = left, p2 = mid + 1, k = left;

        while (p1 <= mid && p2 <= right) {
            if (a[p1] <= a[p2])
                tmp[k++] = a[p1++];
            else
                tmp[k++] = a[p2++];
        }

        while (p1 <= mid) tmp[k++] = a[p1++];//若是第一個序列未檢測完,直接將後面全部元素加到合併的序列中
        while (p2 <= right) tmp[k++] = a[p2++];

        //複製回原數組
        for (int i = left; i <= right; i++)
            a[i] = tmp[i];
    }

4、實現

public static void mergeSort(int[] a) {
        mergeSortInternal(a,0,a.length - 1);
    }
    private static void mergeSortInternal(int[] a, int start, int end) {
        if (start < end) {
            int mid = (start + end) / 2;//分割數組
            mergeSortInternal(a, start, mid);//對左側子序列進行遞歸排序
            mergeSortInternal(a, mid + 1, end);//對右側子序列進行遞歸排序
            merge(a, start, mid, end);//合併
        }
    }
相關文章
相關標籤/搜索