Pagini recente » Cod sursa (job #2808027) | Cod sursa (job #233112) | Cod sursa (job #2821338) | Cod sursa (job #1031045) | Cod sursa (job #2679321)
#include <stdio.h>
#define NMAXX 500000
#define BUCKETS (1 << 16)
#define VALBIT 15
int v1[NMAXX], v2[NMAXX], frecv[BUCKETS], indici[BUCKETS];
inline int nrbucket( int val ) {
return val >> VALBIT;
}
void qsort( int begin, int end ) {
int b = begin, e = end, pivot = v2[(begin + end) / 2], aux;
while ( pivot > v2[b] ) {
b++;
}
while ( pivot < v2[e] ) {
e--;
}
while ( b < e ) {
aux = v2[b];
v2[b] = v2[e];
v2[e] = aux;
do {
b++;
} while ( v2[b] < pivot );
do {
e--;
} while ( v2[e] > pivot );
}
if ( begin < e ) {
qsort( begin, e );
}
if ( e + 1 < end ) {
qsort( e + 1, end );
}
}
int main()
{
FILE *fin, *fout;
int n, i;
fin = fopen( "algsort.in", "r" );
fout = fopen( "algsort.out", "w" );
fscanf( fin, "%d", &n );
for ( i = 0; i < n; i++ ) {
fscanf( fin, "%d", &v1[i] );
}
for ( i = 0; i < n; i++ ) {
frecv[nrbucket( v1[i] )]++;
}
for ( i = 1; i < BUCKETS; i++ ) {
indici[i] = indici[i - 1] + frecv[i - 1];
}
for ( i = 0; i < n; i++ ) {
v2[indici[nrbucket( v1[i] )]++] = v1[i];
}
qsort( 0, frecv[0] - 2 );
for ( i = 1; i < BUCKETS; i++ ) {
frecv[i] += frecv[i - 1];
qsort( frecv[i - 1], frecv[i] - 1 );
}
for ( i = 0; i < n; i++ ) {
fprintf( fout, "%d ", v2[i] );
}
fclose( fin );
fclose( fout );
return 0;
}