算法思路:每个排序在统计时都会消除逆序对,好比冒泡排序法,如果交换位置就会造成逆序对的消失,为了效率,这里用归并排序,所以唯一的问题就是归并排序在哪消失了逆序对?
分析:
在左右两边的区间已经排好,只差合并的时候。
我们把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); }