Pagini recente » Cod sursa (job #148361) | Cod sursa (job #1277088) | Cod sursa (job #1445506) | Cod sursa (job #2343920) | Cod sursa (job #651967)
Cod sursa(job #651967)
#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+=5 )
scanf( "%ud%ud%ud%ud%ud" , i,i+1,i+2,i+3,i+4 ) ;
for( int i = 0 ; i < iteratii ; ++i )
sort( i ) ;
for( int i = 0 ; i < N ; ++i )
printf( "%d " , input[ i ] ) ;
printf( "\n" ) ;
}