【答案解析】问题描述:给定一个数组a,如果a[i]>a[j](i<j),那么a[i]与a[j]被称为一个反序,例如,给定数组{1,5,3,2,6},共有(5,3)、(5,2)和(3,2)三个反序对。
方法一:“蛮力”法。最容易想到的方法是对数组中的每一个数字,遍历它后面的所有数字,如果后面的数字比它小,那么就找到一个逆序对,实现代码如下:
public class Test{
public static int reverseCount(int a[]){
int count=0;
int len=a.length;
for(int i=0; i<len; i++){
for(int j=i+1; j<len; j++){
if(a[i]>a[j]){
count++;
}
}
}
return count;
}
public static void main(String[]args){
int array[]={1, 5, 3, 2, 6};
int count=reverseCount(array);
System.out.println(count);
}
}
程序运行结果为:
3
这种方法是采用二重遍历实现的,因此时间复杂度为O(n^2)。
方法二:分治归并法。可以参:考归并排序的方法,在归并排序的基础上额外使用一个计数器来记录逆序对的个数。下面以数组序列{5,8,3,6}为例,说明计数的方法,归并的过程如下所示。