1. 程式人生 > 實用技巧 >UML 類圖

UML 類圖

歸併排序介紹

歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer) 策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

歸併排序思想示意圖

1-基本思想:

2-合併相鄰有序子序列:

再來看看治階段,我們需要將兩個已經有序的子序列合併成一個有序序列,比如上圖中的最後一次合併,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子序列,合併為最終序列[1,2,3,4,5,6,7,8],來看下實現步驟

程式碼實現

1. public
classmergesort{ 2. publicstaticvoidmain(String[]args){ 3. int[]arr={8,4,4,-4,1,3,6,2}; 4. int[]temp=newint[arr.length]; 5. System.out.println("原陣列為:"+Arrays.toString(arr)); 6. mergeSort(arr,0,arr.length-1,temp); 7. System.out.println("排序後陣列為:"+Arrays.toString(arr)); 8. } 9. 10. /** 11. *分+合方法 12. *@param
arr需要排序的陣列 13. *@paramleft左邊有序序列的初始索引 14. *@paramright右邊索引 15. *@paramtemp做中轉的陣列 16. */ 17. privatestaticvoidmergeSort(int[]arr,intleft,intright,int[]temp){ 18. if(left<right){ 19. intmid=(left+right)/2;//中間索引 20. mergeSort(arr,left,mid,temp);//向左遞迴進行分解 21. mergeSort(arr,mid+1,right,temp);//向右遞迴進行分解 22.
23. merge(arr,left,mid,right,temp);//合併 24. } 25. } 26. 27. //合併的方法 28. privatestaticvoidmerge(int[]arr,intleft,intmid,intright,int[]temp){ 29. inti=left;//標記第一個子陣列的最左端.初始化i,左邊有序序列的初始索引 30. intj=mid+1;//標記第二個子陣列的最左端.初始化j,右邊有序序列的初始索引 31. intt=0;//指向temp陣列的當前索引 32. 33. //(一) 34. //先把左右兩邊(有序)的資料按照規則填充到temp陣列 35. //直到左右兩邊的有序序列,有一邊處理完畢為止 36. while(i<=mid&&j<=right){ 37. //如果左邊的有序序列的當前元素,小於等於右邊有序序列的當前元素 38. //即將左邊的當前元素,填充到temp陣列 39. //然後t++,i++ 40. if(arr[i]<=arr[j]){ 41. temp[t]=arr[i]; 42. i++; 43. t++; 44. }else{ 45. temp[t]=arr[j];//反之,將右邊有序序列的當前元素,填充到temp陣列 46. j++; 47. t++; 48. } 49. } 50. 51. //(二) 52. //把有剩餘資料的一邊的資料依次全部填充到temp 53. while(i<=mid){ 54. temp[t]=arr[i]; 55. i++; 56. t++; 57. } 58. while(j<=right){ 59. temp[t]=arr[j]; 60. j++; 61. t++; 62. } 63. 64. //(三)!!!!重點理解 65. //將temp陣列的元素拷貝到arr 66. //注意,並不是每次都拷貝所有 67. inttempleft=left; 68. //例如: 69. //第一次合併tempLeft=0,right=1 70. //第二次:tempLeft=2,right=3//第三次:tL=0ri=3..... 71. //最後一次tempLeft=0right=7 72. t=0; 73. while(templeft<=right){ 74. arr[templeft]=temp[t]; 75. t++; 76. templeft++; 77. } 78. } 79. }