例题
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤100000,
数列中的元素的取值范围 [1,109]。
输入样例:
6
2 3 4 5 6 1
输出样例:
5
代码
import java.util.Scanner;
/**
* 逆序对数量
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int [] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
int a = sc.nextInt();
arr[i]=a;
}
System.out.println(merge_sort(arr,0,arr.length-1));
}
private static long merge_sort(int[] arr, int l, int r) {
if (l>=r){
return 0;
}
int mid = l + ((r - l) >> 1);
long res = merge_sort(arr,l,mid)+merge_sort(arr,mid+1,r);
int [] temp = new int[r-l+1];
int k =0;
int i=l;
int j = mid+1;
while (i<=mid && j<=r){
if (arr[i]<= arr[j]){
temp[k++] =arr[i++];
}else {
temp[k++]=arr[j++];
res +=mid-i+1;
}
}
while (i<=mid){
temp[k++] =arr[i++];
}
while (j<=r){
temp[k++]=arr[j++];
}
for (int m = l, n=0; m <=r ; m++,n++) {
arr[m] = temp[n];
}
return res;
}
}