歸併排序(Merge Sort)
原理:採用遞歸思想,分而治之。將數組從中間分割成兩部分數組進行排序,其中左半部分和右半部分又遞歸式進行分割排序,直到分割後的數組只剩兩個元素,再逐級向上返回排序好的結果。
歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。歸併排序是一種穩定的排序方法。
邏輯代碼
public class MergeSort {
public static void main(String[] args) {
int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
sort(arr,0,arr.length-1);
Utils.printArr(arr);
}
public static void sort(int[] arr, int left, int right) {
if (left >= right) return;
//分成兩半
int mid = left + (right - left) / 2;
//左邊排序
sort(arr, left, mid);
//右邊排序
sort(arr, mid + 1, right);
merge(arr, left, mid + 1, right);
}
public static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left;//左邊數組開始位置
int j = mid+1;//右邊數組開始位置
int k = 0; //新數組開始位置
while (i <= mid && j <= right) {
//如果左邊數組當前下標對應值 小於 左邊數組當前下標對應值,新數組賦值左邊下標當前值,否則賦值右邊下標當前值
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 把左邊剩餘的數移入數組
while (i <= mid) temp[k++] = arr[i++];
// 把右邊邊剩餘的數移入數組
while (j <= right) temp[k++] = arr[j++];
// 把新數組中的數覆蓋arr數組中的當前排序部分
for (int m = 0; m < temp.length; m++) {
arr[left + m] = temp[m];
}
}
}
2.演示圖:
演示圖片爲轉載,轉載地址:https://www.runoob.com/w3cnote_genre/algorithm
總結
時間複雜度(平均) | 時間複雜度(最好) | 時間複雜度(最壞) | 空間複雜度 | 穩定性 |
---|---|---|---|---|
O(nlogn | O(nlogn) | O(nlogn) | O(n) | 穩定 |