c#程式碼實現排序演算法之歸併排序
阿新 • • 發佈:2018-11-08
歸併排序的平均時間複雜度為O(nlogn),最好時間複雜度為O(nlogn),最壞時間複雜度為O(nlogn),空間複雜度為O(n),是一種穩定的演算法。
1.將待排序序列r(1),r(2),…,r(n)劃分為兩個長度相等的子序列r(1),…r(n/2)和r(n/2+1),…,r(n)。
2.求解子問題:分別對這兩個子序列進行排序,得到兩個有序子序列。
3.合併:將這兩個有序子序列合併成一個有序序列。
歸併排序採用分治法。
public static void merger(int[] list, int low, int mid, int high) { int[] L = new int[mid - low + 2]; int[] R = new int[high - mid + 1]; L[mid - low + 1] = int.MaxValue; R[high - mid] = int.MaxValue; for (int i = 0; i < mid - low + 1; i++) { L[i] = list[low + i]; } for (int i = 0; i < high - mid; i++) { R[i] = list[mid + 1 + i]; } int j = 0; int k = 0; for (int i = 0; i < high - low + 1; i++) { if (L[j] <= R[k]) { list[low + i] = L[j]; j++; } else { list[low + i] = R[k]; k++; } } } public static void cutSortArray(int[] list, int low, int high) { if (low < high) { int mid = (low + high) / 2; cutSortArray(list, low, mid); cutSortArray(list, mid + 1, high); merger(list, low, mid, high); } }