int ans = 0;
void merges(int *a, int lef, int righ)
{
if(lef == righ) /*边界*/
return ;
int mid = lef + (righ - lef) / 2;
merges(a, lef, mid); /*递归左半*/
merges(a, mid + 1, righ); /*递归右半*/
/*接下来合并*/
int totalSize = righ - lef + 1;
int tmp[totalSize];
int n = lef;
int m = mid + 1;
int i = 0;
while(n <= mid || m <= righ)
{
/*右半为空 || 左半不为空且左半值小于右半值*/
if(m > righ || (n <= mid && a[n] <= a[m]))
tmp[i++] = a[n++]; /*将左半部分复制到临时空间*/
else /*当前面的元素大于后一个元素时就会进入这个判断语句c*/
{
tmp[i++] = a[m++];
ans += mid - n + 1;
}
}
n = lef;
for(int i = 0; i < totalSize; i++)
a[n++] = tmp[i];
}
这个更清楚