<pre name="code" class="cpp">#include <stdio.h>
#define N 1500
int num;
void merge(int l, int r, int *a, int *b);
int main()
{
int a[N], b[N];
int n, i;
while( scanf("%d", &n) != -1 )
{
num = 0;
for(i=0; i<n; i++)
scanf("%d", &a[i]);
merge(0, n, a, b);
for(i=0; i<n; i++)
printf("%d ", a[i]);
printf("\n%d\n", num);
}
return 0;
}
void merge(int l, int r, int *a, int *b)
{
int i;
int m, p, q;
if( r-l > 1 )
{
m = (r+l)/2;
merge(l, m, a, b);
merge(m, r, a, b);
p = l, q = m, i = l;
while( p<m || q<r)
{
if( p>=m || (q<r && a[q]<a[p]) )
{
b[i++] = a[q++];
num += m-p; //右边进入b[]时 减去 左边还剩下的元素个数
}
else
{
b[i++] = a[p++];
}
}
for( i=l; i<r; i++ )
a[i] = b[i];
}
}
归并排序求逆序数模板
最新推荐文章于 2022-12-06 07:57:47 发布
