歸併排序思想應用之----求陣列中的逆序對

飄過的小熊發表於2017-04-23

求陣列中的逆序對的問題我在大一的時候就遇到過,沒想到三年了。還是不會。。。。問題擺在那裡,你不主動去解決,那個問題永遠在那,今天不會,你不去看,明天還是不會,後天還是不會,,,,。

參考博文

public class Solution{
    public static int counter=0;
    public static void group(int []nums,int left,int right){
        if(left>right){
            return ;
        }
        int mid=(left+right)/2;
        group(nums,left,mid);
        group(nums,mid+1,right);
        merge(nums,left,mid,right);
    }
    public static void merge(int []nums,int left,int mid,int right){
        int []a=new int[nums.length];
        int i=left;
        int j=mid+1;
        for(int k=left;k<=right;k++){
            a[k]=nums[k];
        }
        for(int k=left;k<=right;k++){
            if(i>mid){
                a[k]=nums[j++];
            }else if(j>right){
                a[k]=nums[i++];
            }else if(a[i]>a[j]){
                a[k]=nums[j++];

                   // 因為如果a[i]此時比右陣列的當前元素a[j]大,    
               // 那麼左陣列中a[i]後面的元素就都比a[j]大    
               // 因為陣列此時是有序陣列    用實際數字來看好像確實是這樣的
                counter+=mid-i+1;
            }else {
                a[k]=nums[i++];
            }
        }

    }


}

相關文章