Cod sursa(job #522205)

Utilizator liviu12345Stoica Liviu liviu12345 Data 14 ianuarie 2011 15:41:26
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>

using namespace std ;

const int MAXN = 500001 ;

int Sir [ MAXN ] , Aux [ MAXN ] ;

void citireSir ( int ) ;

void mergeSort ( int , int ) ;

void afisareSir ( int ) ;

int main ( )
{
  freopen ( "algsort.in" , "r" , stdin ) ;
  freopen ( "algsort.out" , "w" , stdout ) ;
  int sirSize ;
  scanf ( "%d" , &sirSize ) ;
  citireSir ( sirSize ) ;
  mergeSort ( 0 , sirSize - 1 ) ;
  afisareSir ( sirSize ) ;
  return 0 ;
}

void citireSir ( int N )
{
  for ( int i = 0 ; i < N ; ++i )
    scanf ( "%d" , &Sir [ i ] ) ;
  return ;
}

void mergeSort ( int St , int Dr )
{
  if ( Dr - St < 2 )
  {
    if ( Sir [ St ] > Sir [ Dr ] )
    {
      Sir [ St ] ^= Sir [ Dr ] ;
      Sir [ Dr ] ^= Sir [ St ] ;
      Sir [ St ] ^= Sir [ Dr ] ;
    }
    return ;
  }
  int mid = ( St + Dr ) >> 1 ;
  mergeSort ( St , mid ) ;
  mergeSort ( mid + 1  , Dr ) ;
  int k = St , l = mid + 1 , m = St ;
  while ( ( k <= mid ) && ( l <= Dr ) )
    ( Sir [ k ] < Sir [ l ] ) ? ( Aux [ m++ ] = Sir [ k++ ] ) : ( Aux [ m++ ] = Sir [ l++ ] ) ;
  while ( k <= mid )
    Aux [ m++ ] = Sir [ k++ ] ;
  while ( l <= Dr ) 
    Aux [ m++ ] = Sir [ l++ ] ;
  for ( k = St ; k<= Dr ; ++k )
    Sir [ k ] = Aux [ k ] ;
  return ;
}

void afisareSir ( int N )
{
  for ( int i = 0 ; i < N ; ++i )
    printf ( "%d " , Sir [ i ] ) ;
  printf ( "\n" ) ;
  return ;
}