數組中的逆序對

package com.dugstudio.SwordToOfferBook.Singleton.Interview;

import java.util.Arrays;

/**
 * @Author JH
 * @CreateDate 18-6-10
 * @Description  數組中的逆序對
 */
public class InversePairs {
    /**
     * 數組中的逆序對 利用歸併排序 
     * 浪費了copy的空間 以空間換時間
     */
    private static int [] copy;
    public int InversePairs(int [] array) {
            if(array==null||array.length<=0)return 0;
            copy=new int[array.length];
            for (int i=0;i<array.length;i++){
                copy[i]=array[i];
            }
            return InversePairs(array,copy,0,array.length-1);
    }

    private int InversePairs(int[] array, int[] copy, int start, int high) {
        if (start==high){
            //劃分到只剩一個元素 
            copy[start]=array[start];
            return 0;
        }
        int mid=(high+start)>>1;
        int left=InversePairs(array,copy,start,mid);
        int right=InversePairs(array,copy,mid+1,high);
        int i=mid,count=0;
        int k=high,j=high;
        //合併左右分路 從左右的最後一個元素開始比較 將大者放在copy的start-end的最後一個位置
        while(i>=start&&j>mid){
            if (array[i]>array[j]){
                //左邊元素大於右邊元素,則j-mid個元素都可以和左邊的元素組成逆序對
                count+=j-mid;
                copy[k--]=array[i--];
            }else{
                copy[k--]=array[j--];
            }
        }
        while(i>=start){
            copy[k--]=array[i--];
        }
        while (j>mid){
            copy[k--]=array[j--];
        }
        //將copy數組排序後的對應位置複製給array
        for (int m=start;m<=high;m++){
            array[m]=copy[m];
        }
        return count+left+right;
    }

    /**
     * 歸併排序
     * @param array
     * @param start
     * @param end
     */
    public void inverse(int [] array,int start,int end){
        if (start==end)return ;
        int mid=(end+start)/2;
        inverse(array,start,mid);
        inverse(array,mid+1,end);
        merge(array,start,end);
    }
    public void  merge(int [] array,int start,int end){
        for(int i=start;i<=end;i++){
            int min=array[i];int index=i;int j=i+1;
            for (;j<=end;j++){
                if (min>array[j]){
                    min=array[j];
                    index=j;
                }
            }
            if (min!=Integer.MAX_VALUE){
                array[index]=array[i];
                array[i]=min;
            }
        }
    }

    public static void main(String[] args) {
        int [] a={7,5,6,4};
        int [] b={1,2,3,4,5,6,7,0};
        InversePairs i=new InversePairs();
        //i.inverse(b,0,b.length-1);
       // i.inverse(a,0,a.length-1);
        System.out.println(i.InversePairs(a));
        for (int m:copy){
            System.out.print(m);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章