1. 程式人生 > 其它 >歸併排序演算法

歸併排序演算法

歸併排序(Merge Sort)演算法是一種分治思想的遞迴演算法。

快速排序演算法不同的是,歸併排序是先排序小陣列再排序大陣列,而快速排序是先處理大陣列再處理小陣列。

時間複雜度O(n \log n)

空間複雜度O(n)

其中 n 是陣列的長度。

排序演算法步驟

1要排序的陣列是 a ,其元素數量為 n ,設當前處理的陣列長度m = 2

2對所有長度為 m 的子陣列進行歸併(注意此時陣列m的左半陣列和右半陣列是有序的)

2.1 申請長度為 m 的陣列 t 作為額外空間

2.2 將左右兩邊的有序陣列從小到大填到陣列 t 中

2.3 將陣列 t 中的元素複製回原陣列 a

3若 m >= n 則直接結束,否則設 m = m * 2 ,回到步驟二

java程式碼實現

import java.util.Arrays;

public class MergeSort {

    public static void mergeSort(int[] a) {
        int[] t = new int[a.length];
        mergeSort(a, 0, a.length - 1, t);
    }

    public static void mergeSort(int[] a, int left, int right, int[] t) {
        if (left >= right) {
            return;
        }

        int middle = (left + right) / 2;
        mergeSort(a, left, middle, t);
        mergeSort(a, middle + 1, right, t);
        merge(a, left, middle, right, t);
    }

    public static void merge(int[] a, int left, int middle, int right, int[] t) {
        for (int i = left, l = left, r = middle + 1; i <= right; i++) {
            if (l > middle) {
                t[i] = a[r++];
            } else if (r > right) {
                t[i] = a[l++];
            } else if (a[l] <= a[r]) {
                t[i] = a[l++];
            } else { // a[l] > a[r]
                t[i] = a[r++];
            }
        }

        System.arraycopy(t, left, a, left, right - left + 1);
    }

    public static void main(String[] args) {
        int[] a = new int[] { 3, 4, 2, 1, 5 };
        mergeSort(a);
        System.out.println(Arrays.toString(a));
    }
}

原始碼地址https://github.com/SSSxCCC/Algorithm