歸併排序演算法
阿新 • 來源:網路 • 發佈: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));
}
}
