java排序之歸併排序
阿新 • • 發佈:2021-08-30
歸併排序
一、概念及其介紹
歸併排序(Merge sort)是建立在歸併操作上的一種有效、穩定的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。
二、適用說明
當有 n 個記錄時,需進行 logn 輪歸併排序,每一輪歸併,其比較次數不超過 n,元素移動次數都是 n,因此,歸併排序的時間複雜度為 O(nlogn)。歸併排序時需要和待排序記錄個數相等的儲存空間,所以空間複雜度為 O(n)。
歸併排序適用於資料量大,並且對穩定性有要求的場景。
class Solution { public int[] sortArray(int[] nums) { int[] result = new int[nums.length]; sort(nums, 0, nums.length-1, result); return result; } public void sort(int [] nums, int l, int r, int [] result) { if(l>=r) { return; }int mid = (l + r) / 2; sort(nums, l, mid, result); sort(nums, mid + 1, r, result); merge(nums, l, r, mid, result); } public void merge(int [] nums, int l, int r, int mid, int [] result) { int i = l; int j = mid + 1; int k; for(k = l;k<= r;k++) {if(i>mid) { result[k] = nums[j]; j++; } else if(j>r) { result[k] = nums[i]; i++; } else if(nums[i] < nums[j]) { result[k] = nums[i]; i++; } else { result[k] = nums[j]; j++; } } for(int p = l; p<= r; p++) { nums[p] = result[p]; } } }
注意最後:
for(int p = l; p<= r; p++) { nums[p] = result[p]; }
需要將排序後的拷貝到原陣列中,這樣才能滿足後面的遞迴合併的是兩個已經排好序的陣列。