void msort(int l, int r)
{
int mid = (l + r) / 2;
if (l == r)
return;
else
{
msort(l, mid);
msort(mid + 1, r);
}
//以上将完整的数组分成n个独立的小段,但是按顺序排放
int i = l, j = mid + 1, k = l;
//设置下标,k是过程数组b的下表,用于存放每一次排序之后的数组
//i,j分别是二分后左右两段的a数组,根据从小到大的顺序
//依次把a中的值放进b里
while (i <= mid && j <= r)
{
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++], ans += mid - i + 1;//用于计算逆序对数量
}
//以下把al或ar中剩余部分放进b里
while (i <= mid)
b[k++] = a[i++];
while (j <= r)
b[k++] = a[j++];
for (int i = l; i <= r; i++)//将排好序的过程数组放进a数组里
a[i] = b[i];
}
记录一下做题过程中遇到的算法。