Pagini recente » Cod sursa (job #109267) | Cod sursa (job #1360327) | Cod sursa (job #2562454) | Cod sursa (job #2521023) | Cod sursa (job #651969)
Cod sursa(job #651969)
#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 ) ;
int stop = (N/5)*5 ;
for( int i = 0 ; i < stop ; i+=5 )
scanf( "%ud%ud%ud%ud%ud" , &input[i],&input[i+1],&input[i+2],&input[i+3],&input[i+4] ) ;
for( int i = stop ; i < N ; ++i )
scanf( "%ud" , &input[i] ) ;
for( int i = 0 ; i < iteratii ; ++i )
sort( i ) ;
for( int i = 0 ; i < N ; ++i )
printf( "%d " , input[ i ] ) ;
printf( "\n" ) ;
}