一文入門 ETCD
阿新 • • 發佈:2020-07-30
歸併排序(Merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
1.演算法步驟
-
申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列;
-
設定兩個指標,最初位置分別為兩個已經排序序列的起始位置;
-
比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置;
-
重複步驟 3 直到某一指標達到序列尾;
-
將另一序列剩下的所有元素直接複製到合併序列尾。
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; }