一、利用分治演算法的思想,假設下標為0~7,分治過程如下:
[0~7]全部無序 / \ [0~3] [4~7]子序列內無序 / \ / \[0~1] [2~3] [4~5] [6~7]子序列內無序 / \ / \ / \ / \0 1 2 3 4 5 6 7子序列內有序 \ / \ / \ / \ /[0~1] [2~3] [4~5] [6~7]子序列內有序 \ / \ / [0~3] [4~7]子序列內有序 \ / [0~7]全部有序
二、歸併排序演算法如下,其中數組
r 儲存排序後的結果,
s 為待排序來源資料數組:
public static void mergeSort(int [] r, int [] s, int begin, int end){if(begin == end){return;}int middle = (begin + end)/2;mergeSort(r, s, begin, middle);mergeSort(r,s, middle + 1, end);merge(r, s, begin, middle, end);}
其中搜集排序結果的函數merge如下:
public static void merge(int [] r, int [] s, int begin, int middle, int end){int i = begin;int j = middle + 1;int k = begin;while(i <= middle && j <= end){if(s[i] <= s[j]){r[k++] = s[i++];}else{r[k++] = s[j++];}}if(i <= middle){for(; i <= middle; i++){r[k++] = s[i];}}if(j <= end){for(; j <= end; j++){r[k++] = s[j];}}//把有序序列r[begin]~r[end],回寫到s[begin]~s[end],這一步很重要for(int l = begin; l <= end; l++){s[l] = r[l];}}
三、完整的測試程式如下:
package mergeSort;public class MergeSort {public static int [] s = new int[]{5,11,6,4,1,10,9,8,7};public static int [] r = new int[s.length];public static void main(String[] args) {printArr(s, "排序前:");mergeSort(r,s,0,s.length - 1);//調用歸併排序printArr(r, "排序後:");//列印排序結果}//執行歸併排序public static void mergeSort(int [] r, int [] s, int begin, int end){if(begin == end){return;}int middle = (begin + end)/2;mergeSort(r, s, begin, middle);mergeSort(r,s, middle + 1, end);merge(r, s, begin, middle, end);}//把兩個無序的子序列s[begin]~s[middle]和子序列s[middle + 1]~s[end]合并為一個有序序列r[begin]~r[end],然後回寫到s[begin]~s[end]public static void merge(int [] r, int [] s, int begin, int middle, int end){int i = begin;int j = middle + 1;int k = begin;while(i <= middle && j <= end){if(s[i] <= s[j]){r[k++] = s[i++];}else{r[k++] = s[j++];}}if(i <= middle){for(; i <= middle; i++){r[k++] = s[i];}}if(j <= end){for(; j <= end; j++){r[k++] = s[j];}}//把有序序列r[begin]~r[end],回寫到s[begin]~s[end],這一步很重要for(int l = begin; l <= end; l++){s[l] = r[l];}}public static void printArr(int [] arr, String flag){System.out.print(flag);for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + "");}System.out.println();}}
四、測試程式運行結果如下:
排序前:51164110987排序後:14567891011