数组中的逆序对

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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值