递归的动态图:
递归代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100000+100
int map[N];
int temp[N];
long long int sum;
void marge(int l, int ld, int r, int rd)
{
int p = 0;
int i = l;
int j = r;
while(i<=ld && j<=rd)
{
if(map[i]<=map[j])
{
temp[p++] = map[i++];
}
else
{
temp[p++] = map[j++];
sum = sum + (ld-i+1);
}
}
while(i<=ld)
{
temp[p++] = map[i++];
}
while(j<=rd)
{
temp[p++] = map[j++];
}
int k;
for(k=l; k<=rd; k++)
{
map[k] = temp[k-l];
}
}
void msort(int l ,int r)
{
int mid;
if(l<r)
{ mid = (l+r)/2;
msort(l, mid);
msort(mid+1, r);
marge(l, mid, mid+1, r);
}
}
int main()
{
int n, i;
scanf("%d", &n);
sum = 0;
for(i=0; i<n; i++)
{
scanf("%d", &map[i]);
}
msort(0, n-1);
for(i=0; i<n; i++)
{ if(i==n-1)
printf("%d\n", map[i]);
else
printf("%d ", map[i]);
}
printf("%lld\n", sum);
return 0;
}
非递归: