1. 程式人生 > >二路歸並排序java實現

二路歸並排序java實現

sort HR out ner === 函數 nbsp stub todo

二路歸並排序:
其核心思想時將問題一分為二,並遞歸調用一分為二方法,使問題分割到不能再分各的原子問題,然後再歸並,從實現原子問題開始,層層向上歸並,最終解決整體問題。即所謂“分而治之,萬流歸一”


二路歸並排序的時間復雜度計算如下:

技術分享圖片

參考資料:算法導論------遞歸算法的時間復雜度求解:

二路歸並java實現:

 1 public class MergeSort {
 2     
 3     public static void main(String[] args) {
 4         int [] array = {1,8,6,7,2,4,11,17,6,48,3};
 5
//int [] array ={9,8,7,6,5,4,3,2,1}; 6 int [] temp = new int [array.length]; 7 sort(array, temp, 0, array.length - 1); 8 System.out.println("排序後:"); 9 for (int i = 0; i < array.length; i++) { 10 System.out.print(array[i] + " "); 11 } 12 }
13 /** 14 * 總的sort循環。先將問題一分為二,再將問題解決後的兩個子問題結果合並 15 * 要想清楚 子數組 邊界的處理。 16 * 如子數組為 下標為(k,k + 1):則再分解為(K),(K+1)。 17 * 如子數組下標為(k,k+1,k+2):則分解為(k,k+1)和(k+2)。再遞歸調用分解(k,k+1) 18 * @param array 19 * @param temp 20 * @param start 21 * @param end 22 */ 23 public
static void sort (int [] array, int [] temp, int start, int end){ 24 if (start < end) { 25 int mid = (start + end)/2; 26 //解決左邊子問題 27 sort(array, temp, start, mid); 28 //解決右邊子問題 29 sort(array, temp, mid + 1, end); 30 //合並兩個子問題 31 merge(array,temp,start,end,mid); 32 } 33 } 34 /** 35 * 歸並函數 36 * @param array 原始數組 37 * @param temp 輔助數組 38 * @param start 歸並開始坐標 39 * @param end 歸並結束坐標 40 * @param mid = (start + end)/2 41 */ 42 public static void merge(int[] array, int[] temp, int start, int end, int mid) { 43 // TODO Auto-generated method stub 44 //i:左子問題的操作下標; j:右子問題的操作下標 45 int i = start; 46 int j = mid + 1; 47 int k = start; 48 while (i <= mid && j <= end){ 49 if (array[i] < array[j]) { 50 temp[k] = array[i]; 51 k++; 52 i++; 53 }else { 54 temp[k] = array[j]; 55 k++; 56 j++; 57 } 58 } 59 //左子數組還有元素 60 while (i <= mid){ 61 temp[k] = array[i]; 62 k++; 63 i++; 64 } 65 //右子數字還是元素 66 while (j <= end){ 67 temp[k] = array[j]; 68 k++; 69 j++; 70 } 71 72 //將輔助數組中排好序的元素復制到原數組 73 //註意:輔助數組與原數組一一對應 74 for (int index = start; index <= end; index ++){ 75 array[index] = temp[index]; 76 System.out.println("temp[" + index +"]" + "....." + temp[index]); 77 } 78 System.out.println("==============="); 79 } 80 }

通過控制臺輸出,我們可以看到排序的過程:

temp[0].....1
temp[1].....8
===============
temp[0].....1
temp[1].....6
temp[2].....8
===============
temp[3].....2
temp[4].....7
===============
temp[3].....2
temp[4].....4
temp[5].....7
===============
temp[0].....1
temp[1].....2
temp[2].....4
temp[3].....6
temp[4].....7
temp[5].....8
===============
temp[6].....11
temp[7].....17
===============
temp[6].....6
temp[7].....11
temp[8].....17
===============
temp[9].....3
temp[10].....48
===============
temp[6].....3
temp[7].....6
temp[8].....11
temp[9].....17
temp[10].....48
===============
temp[0].....1
temp[1].....2
temp[2].....3
temp[3].....4
temp[4].....6
temp[5].....6
temp[6].....7
temp[7].....8
temp[8].....11
temp[9].....17
temp[10].....48
===============
排序後:
1 2 3 4 6 6 7 8 11 17 48 

二路歸並排序java實現