Cod sursa(job #650637)

Utilizator liviu12345Stoica Liviu liviu12345 Data 18 decembrie 2011 16:33:04
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 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 << 16 ] ;
unsigned int input[ MAXN ] ;

int N ;

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

void sort( unsigned int oct ){
  oct *= 4 ;
  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 < 65536 ; ++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 < 8 ; ++i )
    sort( i ) ;
  for( int i = 0 ; i < N ; ++i )
    printf( "%d " , input[ i ] ) ;
  printf( "\n" ) ;
}