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];
        }
    }

你可能感兴趣的:(数据结构)