Day1:歸併排序
阿新 • • 發佈:2018-11-02
歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
程式碼實現:
public class bbb2 { public static int[] sort(int array[],int low,int high) { int mid=(high+low)/2; if(low<high) { sort(array,low,mid); sort(array,mid+1,high); merge(array,low,mid,high); } return array; } private static void merge(int[] array, int low, int mid, int high) { int temp[]=new int [high-low+1];/*為什麼加1?因為等下引數輸入的時候high是length-1(因為比如lenth=10的時候末尾位置是9),而這裡是新建一個數組,長度應該和array相等,所以應該是high-low+1而不是high-low*/ //設定臨時變數儲存分割成的兩端陣列的頭標 int i=low; int j=mid+1; int k=0;//這個是給temp用的 //從小到大排序 while(i<=mid&&j<=high) { if(array[i]<array[j]) temp[k++]=array[i++]; else temp[k++]=array[j++]; } //把array[i]裡面剩下的加入temp while(i<=mid) { temp[k++]=array[i++]; } //把array[j]裡面剩下的加入temp while(j<=high) { temp[k++]=array[j++]; } //把temp裡面的重新匯入array for(int m=0;m<array.length;m++) { array[m+low]=temp[m];//為什麼是array[m+low]而不是array[m]?因為對於sort(array,mid+1,high)來說,他的low是mid+1,如果用array[m]的話,那這半邊就加入不了了。 } } public static void main(String[] args) { int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 }; bbb.sort(nums, 0, nums.length-1); System.out.println(Arrays.toString(nums)); } }
執行結果: