Java 數據結構(一)---排序(三) 歸併排序

一、歸併排序

是採取分治的思想
1、先劃分步長(gap)
2、根據步長劃分數據(定長數據+剩餘數據)
3、小區域內排序

   public int[] mergeSort(int[] A, int n) {
     for (int gap = 1; gap < A.length; gap = 2 * gap) 
        MergePass(A, gap, n);
     return A;
    }


    public void MergePass(int[] A, int gap, int length) {

        int i = 0;
    // 歸併gap長度的兩個相鄰子表
        for (i = 0; i + 2 * gap < length; i += 2 * gap) {
               Merge(A, i, i + gap - 1, i + 2 * gap - 1);
       }
    // 餘下兩個子表,後者長度小於gap
        if (i + gap  < length) {
            Merge(A, i, i + gap - 1, length-1);
       }

     }

    /**
    排序,先開闢一片內存空間 ,然後根據大小排放

    */
    public void Merge(int[] A, int low,int mid,int high){
        int i=low;
        int j=mid+1;
        int k=0;
        int[] A2=new int[high-low+1];
        while(i<=mid && j<=high){
            if(A[i]<=A[j]){
                A2[k]=A[i];
                k++;
                i++;
            }else{
                A2[k]=A[j];
                k++;
                j++;
            }
        }

        while(i<=mid){
            A2[k]=A[i];
            k++;
            i++;
        }

        while(j<=high){
            A2[k]=A[j];
            k++;
            j++;
        }

        for(k=0,i=low;i<=high;i++,k++){
            A[i]=A2[k];
        }
    }
發佈了88 篇原創文章 · 獲贊 25 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章