【演算法】歸併排序(MergeSort)
阿新 • • 發佈:2020-08-27
1.簡介
時間複雜度(time complexity)
:
Average: O(nlogn)
Worst: O(nlogn)
空間複雜度(space comlexity)
: O(n)
2.演算法思想
歸併排序是分治法(Divide and Conquer)的典型應用之一。其思想是將一個序列切割為最小單位的子序列(即只有一個元素的序列),使每個子序列有序(一個元素必然有序啦),再將有序的子序列兩兩合併(重點操作),保證合併後的序列仍然有序。
3.實現步驟
l: 最左元素的index r:最右元素的Index
1.判斷引數有效,作為遞迴的出口。
l < r
2.找到中間點m,將一個序列分為兩個子序列
m = (r+l) / 2
3.對第一個子序列呼叫mergeSort
mergeSort(arr,l,m)
4.對第二個子序列呼叫mergeSort
mergeSort(arr,m+1,r)
5.將排序好的兩個子序列合併在一起且保證合併後的序列有序
merge(arr,l,m,r)
4.程式碼
static void merge(int[] arr, int l, int m, int r) { int[] temp = new int[arr.length]; int k = l; int p = m + 1; int index = 0; while (k <= m || p <= r) { if (k <= m && p <= r) { temp[index++] = arr[k] < arr[p] ? arr[k++] : arr[p++]; } else { if (k <= m) { temp[index++] = arr[k++]; } else { temp[index++] = arr[p++]; } } } for (int i = 0; i < index; i++) { arr[l + i] = temp[i]; } } static void mergeSort(int[] arr, int l, int r) { if (l < r) { int m = (l + r) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); } }