1. 程式人生 > >用Java實現歸併排序與總結

用Java實現歸併排序與總結

一、思路

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]+" ");
         }

    }
}