Pagini recente » Cod sursa (job #333719) | Cod sursa (job #2319028) | Cod sursa (job #669157) | Cod sursa (job #1346536) | Cod sursa (job #2679334)
#include <stdio.h>
#define MAX_N 500000
#define VAL (1 << 31)
#define BUCK (1 << 16)
#define VAL_PER_BUCK (1 << 15)
#define VAL_PER_BUCK_B 15
int v[MAX_N], vsort[MAX_N], ind[BUCK], val[BUCK], f[VAL_PER_BUCK];
int getBucketNum( int a ) {
return a >> VAL_PER_BUCK_B;
}
void sort( int begin, int end ) {
int aux, b, e, p;
b = begin;
e = end;
p = vsort[(begin + end) / 2];
while ( vsort[b] < p )
b++;
while ( vsort[e] > p )
e--;
while ( b < e ) {
aux = vsort[b];
vsort[b] = vsort[e];
vsort[e] = aux;
do
b++;
while ( vsort[b] < p );
do
e--;
while ( vsort[e] > p );
}
if ( begin < e )
sort( begin, e );
if ( e + 1 < end )
sort( e + 1, end );
}
int main() {
FILE *fin, *fout;
int n, p, i;
fin = fopen( "algsort.in", "r" );
fscanf( fin, "%d", &n );
for ( i = 0; i < n; i++ )
fscanf( fin, "%d", &v[i] );
fclose( fin );
for ( i = 0; i < n; i++ )
val[getBucketNum( v[i] )]++;
ind[0] = 0;
for ( i = 1; i < BUCK; i++ )
ind[i] = ind[i - 1] + val[i - 1];
for ( i = 0; i < n; i++ ) {
p = getBucketNum( v[i] );
vsort[ind[p]] = v[i];
ind[p]++;
}
for ( i = 0; i < BUCK; i++ ) {
if ( val[i] != 0 )
sort( ind[i] - val[i], ind[i] - 1 );
}
fout = fopen( "algsort.out", "w" );
for ( i = 0; i < n; i++ )
fprintf( fout, "%d ", vsort[i] );
fclose( fout );
return 0;
}