描述:从小到大排列,并计算比较次数
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N = 10001 ;
const int MAXX= 100056 ;
int data[ N] ;
int times;
void merage ( int left, int mid, int right)
{
int l1[ N] = { 0 } , l2[ N] = { 0 } ;
int i= 1 , j= 1 ;
int n1= mid- left+ 1 ;
int n2= right- mid;
for ( i= 1 ; i<= n1; i++ )
l1[ i] = data[ left+ i- 1 ] ;
l1[ n1+ 1 ] = MAXX;
for ( i= 1 ; i<= n2; i++ )
l2[ i] = data[ mid+ i] ;
l2[ n2+ 1 ] = MAXX;
i= 1 , j= 1 ;
for ( int k= left; k<= right; k++ )
{
if ( l1[ i] <= l2[ j] )
{
data[ k] = l1[ i] ;
i++ ;
times++ ;
}
else
{
data[ k] = l2[ j] ;
j++ ;
times++ ;
}
}
}
void meragesort ( int left, int right)
{
int mid= 0 ;
if ( left>= right)
return ;
else
{
mid = ( left+ right) / 2 ;
meragesort ( left, mid) ;
meragesort ( mid+ 1 , right) ;
merage ( left, mid, right) ;
}
}
int main ( )
{
int n= 0 ;
cin>> n;
for ( int i= 1 ; i<= n; i++ )
scanf ( "%d," , & data[ i] ) ;
meragesort ( 1 , n) ;
for ( int i= 1 ; i<= n; i++ )
cout<< data[ i] << " " ;
cout<< endl;
cout<< times;
return 0 ;
}