您的位置:首页 > 其它

数组中的逆序对

2016-05-13 14:46 78 查看
题目描述

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

思路一:

暴力破解,通过两次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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: