歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題而後遞歸求解,而治(conquer)的階段則將分的階段獲得的各答案"修補"在一塊兒,即分而治之)。html
public static void mergeSort(int[] elements) { if(null == elements || 1 >= elements.length) { // do nothing } else { int[] temp = new int[elements.length]; sort(elements, 0, elements.length-1, temp); } } private static void sort(int[] elements,int left,int right,int[] temp) { if(left < right) { int mid = (left + right) >> 1; sort(elements, left, mid, temp); sort(elements, mid+1, right, temp); merge(elements,left,mid,right,temp); } } private static void merge(int[] elements, int left, int mid, int right, int[] temp) { System.out.println("left="+left+",right="+right+",mid="+mid); int l = left;// 左數組指針 int r = mid + 1;// 右數組指針 int t = 0;// 臨時數組指針 while(l <=mid && r<=right) { if(elements[l] <= elements[r]) { temp[t++] = elements[l++]; } else { temp[t++] = elements[r++]; } } // 將左邊剩餘元素填充進temp中 while(l <= mid) { temp[t++] = elements[l++]; } // 將右邊剩餘元素填充進temp中 while(r <= right) { temp[t++] = elements[r++]; } t = 0; while(left <= right) { elements[left++] = temp[t++]; } System.out.println("elements="+Arrays.toString(elements)); System.out.println("------------------------------------------------"); }
測試代碼:java
public static void main(String[] args) { int[] array = {82 ,31 ,29 ,71, 72, 42, 64, 5, 110}; mergeSort(array); }
結果:算法
left=0,right=1,mid=0 elements=[31, 82, 29, 71, 72, 42, 64, 5, 110] ------------------------------------------------ left=0,right=2,mid=1 elements=[29, 31, 82, 71, 72, 42, 64, 5, 110] ------------------------------------------------ left=3,right=4,mid=3 elements=[29, 31, 82, 71, 72, 42, 64, 5, 110] ------------------------------------------------ left=0,right=4,mid=2 elements=[29, 31, 71, 72, 82, 42, 64, 5, 110] ------------------------------------------------ left=5,right=6,mid=5 elements=[29, 31, 71, 72, 82, 42, 64, 5, 110] ------------------------------------------------ left=7,right=8,mid=7 elements=[29, 31, 71, 72, 82, 42, 64, 5, 110] ------------------------------------------------ left=5,right=8,mid=6 elements=[29, 31, 71, 72, 82, 5, 42, 64, 110] ------------------------------------------------ left=0,right=8,mid=4 elements=[5, 29, 31, 42, 64, 71, 72, 82, 110] ------------------------------------------------
參考博客:https://www.cnblogs.com/chengxiao/p/6194356.html數組