逆序对的定义:在一个数字数组中,如果存在索引 $i$ 和 $j$(其中 $i < j$),使得 $arr[i] > arr[j]$,则称其为一个逆序对。
逆序对的个数是等于相邻两个数交换,然后使数列变有序的次数
在归并之中,我们将两个有序数组归并为一个有序数组的时候,出现的反序通过计算就可以得出真实的逆序对个数,下面来自Acwing的这个动图多看几遍会解释的很清楚
int merge_sort(int l, int r)
{
if (l >= r) return 0;
int mid = l + r >> 1;
int res = (merge_sort(l, mid) + merge_sort(mid + 1, r));
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r)
if (b[i] < b[j]) p[k ++ ] = b[i ++ ];
else p[k ++ ] = b[j ++ ], res = (res + mid - i + 1);
while (i <= mid) p[k ++ ] = b[i ++ ];
while (j <= r) p[k ++ ] = b[j ++ ];
for (i = l, j = 0; j < k; i ++, j ++ ) b[i] = p[j];
return res;
}