Cod sursa(job #650661)

Utilizator liviu12345Stoica Liviu liviu12345 Data 18 decembrie 2011 17:16:05
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std ;

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

const unsigned int octSize = 16 ;
const unsigned int octGet = (1<<octSize) - 1 ;
const unsigned int distribSize = 1 << octSize ;
const unsigned int iteratii = 32%octSize ? 32 / octSize + 1 : 32 / octSize ;

const int MAXN = 500000 ;

Nod buffer[ MAXN ] ;
Nod* distrib[ distribSize ] ;
unsigned int input[ MAXN ] ;

int N ;

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

void sort( unsigned int oct ){
  oct *= octSize ; ;
  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 <  distribSize ; ++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 ) ;
  unsigned int *stop = input + N ;
  for( unsigned int *i = input ; i < stop ; ++i )
    scanf( "%ud" , i ) ;
  for( int i = 0 ; i < iteratii ; ++i )
    sort( i ) ;
  for( int i = 0 ; i < N ; ++i )
    printf( "%d " , input[ i ] ) ;
  printf( "\n" ) ;
}