数组中的逆序对

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

思路一:
暴力破解,通过两次for循环来判断。

public int InversePairs(int [] array) {
    if(array.length<2) return 0;
    int nums = 0;
    for(int i=0;i<array.length;i++){
        for(int j=i+1;j<array.length;j++){
            if(array[i] > array[j])
                nums++;
        }
    }
    return nums;
}

思路二:
使用归并排序的思想:先把数组分割成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目,在统计逆序对的过程中,还需要对数组进行排序。

public int InversePairs(int [] array) {
    if(array.length<=0)
        return 0;
    return mergesort(array,0,array.length-1);
}

public int  mergesort(int[] array,int l,int r){
    if(l>=r){
        return 0;
    }
    int mid=(l+r)/2;
    int lnums=mergesort(array,l,mid);
    int rnums=mergesort(array,mid+1,r);
   return  lnums+rnums+merge(array,l,mid,r);
}

public int merge(int[] array,int l,int mid,int r){
   int [] temp = new int[r-l+1];

   int count=0;
   int i=l,j=mid+1,t=0;
   while(i<=mid||j<=r){
       if(i>mid&&j<=r){
           temp[t++]=array[j];
           j++;
           continue;
       }else if(i<=mid&&j>r){
           temp[t++]=array[i];
           i++;
           continue;
       }
       if(array[i]>array[j]){
           temp[t++]=array[j];
           count+=mid-i+1;
           j++;

       }else {
           temp[t++]=array[i];
           i++;
       }
   }
   for(i=l;i<=r;i++){
       array[i]=temp[i-l];
   }
   return count;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值