Cod sursa(job #650623)

Utilizator liviu12345Stoica Liviu liviu12345 Data 18 decembrie 2011 16:16:48
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <cstdlib>

using namespace std ;

struct Nod{
  unsigned int val ;
  Nod* link ;
} ;

const int MAXN = 500000 ;

Nod buffer[ MAXN ] ;
Nod* distrib[ 1 << 8 ] ;
unsigned int input[ MAXN ] ;

int N ;

inline unsigned int getO( unsigned int &a , int &oct ){
  return ( a >> oct ) & 0xffff ;
}

void sort( int oct ){
  for( int i = N-1 ; i >= 0 ; --i ){
    buffer[ i ].val = input[ i ] ;
    buffer[ i ].link = distrib[ getO( input[ i ] , oct ) ] ;
    distrib[ getO( input[ i ] , oct ) ] = &buffer[ i ] ;
  }
  int k = -1 ;
  for( int i = 0 ; i < 256 ; ++i ){
    while( distrib[ i ] ){
      input[ ++k ] = distrib[ i ]->val ;
      distrib[ i ] = distrib[ i ]->link ;
    }
  }
}

int main( ) {
  freopen( "algsort.in" , "r" , stdin ) ;
  freopen( "algsort.out" , "w" , stdout ) ;
  scanf( "%d" , &N ) ;
  for( int i = 0 ; i < N ; ++i )
    scanf( "%d" , &input[ i ] ) ;
  for( int i = 0 ; i < 4 ; ++i )
    sort( i ) ;
  for( int i = 0 ; i < N ; ++i )
    printf( "%d " , input[ i ] ) ;
  printf( "\n" ) ;
}