歸併排序演算法
阿新 • • 發佈:2021-03-17
歸併排序(Merge Sort)演算法是一種分治思想的遞迴演算法。
與快速排序演算法不同的是,歸併排序是先排序小陣列再排序大陣列,而快速排序是先處理大陣列再處理小陣列。
時間複雜度:
空間複雜度:
其中 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)); } }