有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组中的逆序对个数。
给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000。
测试样例:
[1,2,3,4,5,6,7,0],8
返回:7
import java.util.*;
public class AntiOrder {private int res = 0;
public int count(int[] A, int n) {
if(n>0){
int[] B= new int[n];
merge(A, 0, n - 1, B);
}
return res;
}
public void merge(int[] A,int low, int high,int[] B) {
if(low<high){
int mid = low + ((high-low)>>1);
merge(A,low,mid,B);
merge(A,mid+1,high,B);
mergeSort(A,low,mid,high,B);
}
}
private void mergeSort(int[] a, int low, int mid, int high, int[] b) {
int i = mid;
int j = high;
int index = high;
while(i>=low&&j>mid){
if(a[i]>a[j]){
res+=j-mid;
b[index--] = a[i--];
}else{
b[index--] = a[j--];
}
}
while(i>=low){
b[index--] = a[i--];
}
while(j>mid){
b[index--] =a[j--];
}
for(int t=high;t>=low;t--){
a[t] = b[t];
}
}
}
题目来源:数组中的逆序对