参考:
https://www.acwing.com/solution/content/18376/
注意:
1.完全逆序的时候
时间复杂度是n*(n-1)/2,代入n计算,会发现爆int,所以用LL
2.关于为什么mid-i+1
:
* i属于L,j属于R,
构成逆序对的条件是A[i]要比A[j]大。
而i后面有多少个数,就有多个逆序对。
所以mid-i+1(mid-i 减法不包括i,所以+1,意思是加上i这个位置)
LL merge_sort(int A[], int l, int r){
if(l >= r) return 0;
int mid = (l + r >> 1);
LL res = merge_sort(A, l ,mid) + merge_sort(A, mid + 1, r); //注意 res=L+R
int k = 0, i = l, j = mid + 1, tmp[max];
while(i <= mid && j <= r)
if(A[i] <= A[j]) tmp[k++] = A[i++];
else{
tmp[k++] = A[j++];
res += mid - i + 1; //A[i]要比A[j]大时
}
while(i <= mid) tmp[k++] = A[i++];
while(j <= r) tmp[k++] = A[j++];
for(int i = l, k = 0; i <= r; i++, k++ ){
A[i] = tmp[k];
}
return res; //有返回值,在上面else计算
}
赞