【题目描述】
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
【输出】
所有逆序对总数。
```Java
import java.util.Scanner;
public class Main {
public static 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 < n; i++) {
arr[i] = sc.nextInt();
}
Merge test = new Merge(arr);
test.divide(0, arr.length - 1);
System.out.println(test.ans);
}
}
public static class Merge{
int []arr;
int []temp;
int ans = 0;
public Merge(int[] arr) {
this.arr = arr;
temp = new int[arr.length];
}
public void divide(int start, int end) {
if(start < end) {
int mid = (start + end) / 2;
divide(start, mid);
divide(mid + 1, end);
merge(start, mid, end);
}
}
public void merge(int start, int mid, int end) {
int i = start;
int j = mid + 1;
int index = 0;
while(i <= mid && j <= end) {
if(arr[i] <= arr[j]) {
temp[index++] = arr[i];
i++;
}else {
temp[index++] = arr[j];
j++;
ans += mid - i + 1;
}
}
while(i <= mid) {
temp[index++] = arr[i];
i++;
}
while(j <= end) {
temp[index++] = arr[j];
j++;
}
index = 0;
for(i = start; i <= end; i++) {
arr[i] = temp[index++];
}
}
}
}