算法思路:每个排序在统计时都会消除逆序对,好比冒泡排序法,如果交换位置就会造成逆序对的消失,为了效率,这里用归并排序,所以唯一的问题就是归并排序在哪消失了逆序对?

分析:

在左右两边的区间已经排好,只差合并的时候。
我们把1放到第一个的时候,在1前面的数字一定比他大。(这句话好好理解一下)
那么逆序对消失的个数就是之间的差值,上两个关键的函数。
以此我们就能去维护一个ans 去统计逆序对消失的个数,直到最后逆序对消失为0(排序完毕)。

void _merge(int l, int mid, int r)
{
    int p1 = l, p2 = mid + 1;
    for (int i = l; i <= r; i++)
    {
        if ((p1 <= mid) && (p2 > r) || (a[p1] <= a[p2]))
        {
            b[i] = a[p1++];
        }
        else
        {    
            ans +=(p2 - i);
            b[i] = a[p2++];
        }
    }
    for (int i = l; i <= r; i++)
    {
        a[i] = b[i];//b[i]临时数组
    }
}
void erfen(int l, int r)
{
    int mid = (l + r) >> 1;
    if (l < r)
    {
        erfen(l, mid);
        erfen(mid + 1, r);
    }
    _merge(l, mid, r);    
}