利用分治算法求一组数据的逆序对个数
注意:假如一组数据是小到大为正序,那么前面的一个数据大于后面的一个数据就是逆序。
这里借助归并排序,在合并的时候,进行统计逆序对的个数
//全局变量,用来记录逆序对的个数
private int count = 0;
public int sum(int[] data, int n){
count = 0;
mergeSort(data,0,n - 1);
return count;
}
public void mergeSort(int [] data,int low, int high){
if(low >= high)
return;
int mid = low + ((high - low) >> 1);
mergeSort(data,low,mid);
mergeSort(data,mid + 1, high);
merge(data,low,mid,high);
}
public void merge(int [] data, int low, int mid, int high){
int [] temp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int index = 0;
while(i <= mid && j <= high){
if(data[i] > data[j]){
//用来计数
count += (mid - i + 1);
temp[index++] = data[j++];
}
else{
temp[index++] = data[i++];
}
}
while(i <= mid) temp[index++] = data[i++];
while(j <= high) temp[index++] = data[j++];
for(int key = 0; key < index; key++){
data[low + key] = temp[key];
}
}