用Java實現歸併排序與總結
阿新 • • 發佈:2018-12-23
一、思路
1.劃分:用遞迴的思想將陣列進行劃分,劃分原則類似於二分查詢,直到劃分單元的元素個數為1.
2.歸併:在將同層的兩個有序子組歸併成一個有序子組,複製一個將兩個有序子組合並的陣列,設定兩個遊標,初始位置為複製陣列對應的兩個有序子組的起始位置,比較兩個遊標所指向的元素的大小,將小的元素放入到合併空間,直到歸併完成
二、程式碼:
public class RandomArrCre { //生成有n個元素的隨機陣列,每個元素的隨機範圍為(rangeL,rangeR) public static int[] generateRandomArray( int n, int rangeL, int rangeR) { Random rand=new Random(); int arr[]=new int[n]; for (int i=0;i<n;i++) { arr[i]=rand.nextInt(rangeR-rangeL+1)+rangeL; } return arr; } } public class Sort{ public static void MergeSort(int[] arr,int L, int R,int[] copy) { int length=R-L+1; //傳入陣列範圍的長度 if (length >= 2) // 進行類似二分查詢的分組(劃分) { MergeSort(arr, L, L + length / 2 - 1, copy); MergeSort(arr, L + length / 2, R, copy); } //進行歸併 int y=L, l = L, r = L + length / 2; // 要歸併分組對應的遊標 while (l <= L + length / 2 - 1&& r<=R ) { int sel = 0; if(copy[l]>copy[r]) sel=1; if(copy[l]==copy[r]) sel=2; if(copy[l]<copy[r]) sel=3; switch (sel) { case 1: arr[y] = copy[r]; r++; y++; break; case 2: arr[y]=copy[l]; y++; arr[y]=copy[r]; y++; l++; r++; break; case 3: arr[y]=copy[l]; l++; y++; break; } } while(y<=R&&r> R) { arr[y] = copy[l]; l++; y++; } for (int i = L; i <= R; i++) { copy[i] = arr[i]; } } public static void main(String[] args) { int[] arr=RandomArrCre.generateRandomArray(30,1,10); // int[] arr={37,10,41,14,20,27,10,20}; int[] copy=new int[arr.length]; for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); copy[i]=arr[i]; } System.out.println(); MergeSort(arr,0,arr.length-1,copy); for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } } }