给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
6
2 3 4 5 6 1
输出样例:5
解题思路:
第一组: 2 3 4 5
第二组:1 6
归并排序时的两组数据每一组都是已序的,第一组中某个值大于第二组中的某个值,那么第一组这个值后面的所有值都大于这个值
比如第一组中,2<>1为逆序对,那么3<>1,4<>1,5<>1都是逆序对
以此递归解决即可
int merge_sort(int a[], int l, int r) {
if (l >= r) return 0;
int mid = (l + r) >> 1; //寻找中间点
int ta = merge_sort(a, l, mid);
int tb = merge_sort(a, mid + 1, r);
int k = 0; //暂存数组的标志
int i = l, j = mid + 1; //设置起始地点
int tc = 0; //当前部分
//排序部分
while (i <= mid && j <= r)
if (a[i] <= a[j]) temp[k++] = a[i++];
else {
temp[k++] = a[j++];
tc += r - i + 1;
}
while(i <= mid) temp[k++] = a[i++];
while(j <= r) temp[k++] = a[j++];
for (int i = l, j = 0; i <= r; i++, j++) a[i] = temp[j];
return ta + tb + tc;
}