Pagini recente » Cod sursa (job #2942686) | Cod sursa (job #3289348) | Cod sursa (job #1380884) | Cod sursa (job #1629597) | Cod sursa (job #650659)
Cod sursa(job #650659)
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std ;
struct Nod{
unsigned int val ;
Nod* link ;
} ;
const unsigned int octSize = 12 ;
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( "%ud " , input[ i ] ) ;
printf( "\n" ) ;
}