八大選擇排序之歸併排序(Merge Sort)

 public static void mergeSort(int[] arr) {
        mSort(arr, 0, arr.length-1);
    }

    /**
     * 遞歸分治
     * @param arr 待排數組
     * @param left 左指針
     * @param right 右指針
     */
    public static void mSort(int[] arr, int left, int right) {
        if(left >= right)
            return ;
        int mid = (left + right) / 2;

        mSort(arr, left, mid); //遞歸排序左邊
        mSort(arr, mid+1, right); //遞歸排序右邊
        merge(arr, left, mid, right); //合併
    }
    //將有序數組s[m…p]和s[p+1 …n]歸併到數組s[m…n]
    public static void merge(int s[], int m, int p, int n){
        //s[m…p]從m開始,s[p+1 …n]數組從p+1開始,輔助數組sm[]從k=0開始
        int i=m,j=p+1,k=0;
        int sm[] = new int[n-m+1];
        for(; i<=p && j<=n; k++){
            //倆個待合併有序數組依次比較選出小的賦值給輔助數組
            //選擇哪個數組的值,哪個數組就i++/j++,再重新進行比較
            if(s[i]<s[j]){
                sm[k] = s[i++];
            }else {
                sm[k] = s[j++];
            }
        }
        //跳出for循環後,哪個數組有剩餘,就把哪個數組的剩餘數據依次複製給輔助數組sm[]
        while (i<=p){
            sm[k++] = s[i++];
        }
        while (j<=n){
            sm[k++] = s[j++];
        }
        //將sm[]賦值給s[]
        for(int x=0; x<sm.length; x++){
            s[m+x] = sm[x];
        }
    }
    //主函數
    public static void main(String[] args) {
        int a[] = {3,2,5,8,4,7,6,9};
        mergeSort(a);
        for(int x=0; x<8; x++){
            System.out.print(a[x]+" ");
        }
        System.out.println();
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章