1. 程式人生 > 實用技巧 >一文入門 ETCD

一文入門 ETCD

歸併排序(Merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

1.演算法步驟

  1. 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列;

  2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置;

  3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置;

  4. 重複步驟 3 直到某一指標達到序列尾;

  5. 將另一序列剩下的所有元素直接複製到合併序列尾。

2.動圖演示

3.程式碼實現

public int[] sort(int[] sourceArray) throws Exception {
    // 對 arr 進行拷貝,不改變引數內容
    int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

    if (arr.length < 2) {
        return arr;
    }
    int middle = (int) Math.floor(arr.length / 2);

    int[] left = Arrays.copyOfRange(arr, 0, middle);
    int[] right = Arrays.copyOfRange(arr, middle, arr.length);

    return merge(sort(left), sort(right));
}

protected int[] merge(int[] left, int[] right) {
    int[] result = new int[left.length + right.length];
    int i = 0;
    while (left.length > 0 && right.length > 0) {
        if (left[0] <= right[0]) {
            result[i++] = left[0];
            left = Arrays.copyOfRange(left, 1, left.length);
        } else {
            result[i++] = right[0];
            right = Arrays.copyOfRange(right, 1, right.length);
        }
    }

    while (left.length > 0) {
        result[i++] = left[0];
        left = Arrays.copyOfRange(left, 1, left.length);
    }

    while (right.length > 0) {
        result[i++] = right[0];
        right = Arrays.copyOfRange(right, 1, right.length);
    }

    return result;
}