#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int a[11000];
int b[11000];
int sum;
void Union( int low, int high )
{
int mid=( low+high )/2;
int k=0;
int i=mid;
int j=high;
while( i>=low && j>=mid+1 )
{
if( a[i]>a[j] )
{
sum+=j-mid;
b[k++]=a[i--];
}
else
b[k++]=a[j--];
}
while( i>=low )
{
b[k++]=a[i--];
}
while( j>mid )
b[k++]=a[j--];
k--;
for( i=low; i<=high;i++ )
a[i]=b[k--];
}
void erfen( int low, int high )
{
if( low==high )
return ;
int mid=( low+high )/2;
erfen( low, mid );
erfen( mid+1, high );
Union( low, high );
}
int main()
{
int i, j, k, n;
while( scanf( "%d",&n ),n )
{
sum=0;
for( i=0;i<n;i++ )
scanf( "%d",&a[i] );
erfen( 0, n-1 );
printf( "%d\n" ,sum );
for( i=0;i<n;i++ )
printf( "%d ",a[i] );
printf( "\n" );
}
return 0;
}
归并排序 逆序数
最新推荐文章于 2022-07-01 17:30:45 发布