歸併排序是另外一種不一樣的排序方法,由於歸併排序使用了遞歸分治的思想,因此理解起來比較容易。其基本思想是,先遞歸劃分子問題,而後合併結果。把待排序列當作由兩個有序的子序列,而後合併兩個子序列,而後把子序列當作由兩個有序序列。。。。。倒着來看,其實就是先兩兩合併,而後四四合並。。。最終造成有序序列。空間複雜度爲O(n),時間複雜度爲O(nlogn)。 數組
舉個栗子:指針
實現代碼:code
public class MergeSort { public static void mergeSort(int[] arr) { mSort(arr, 0, arr.length-1); } /** * 遞歸分治 * @param arr 待排數組 * @param left 左指針 * @param right 右指針 */ public static void mSort(int[] arr, int left, int right) { if(left >= right) return ; int mid = (left + right) / 2; mSort(arr, left, mid); //遞歸排序左邊 mSort(arr, mid+1, right); //遞歸排序右邊 merge(arr, left, mid, right); //合併 } /** * 合併兩個有序數組 * @param arr 待合併數組 * @param left 左指針 * @param mid 中間指針 * @param right 右指針 */ public static void merge(int[] arr, int left, int mid, int right) { //[left, mid] [mid+1, right] int[] temp = new int[right - left + 1]; //中間數組 int i = left; int j = mid + 1; int k = 0; while(i 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++]; } for(int p=0; p) { [left + p] = temp[p]; } } }