Pagini recente » Cod sursa (job #1096854) | Cod sursa (job #2285360) | Cod sursa (job #1818611) | Cod sursa (job #1353830) | Cod sursa (job #2680789)
#include <stdio.h>
#define NMAXX 500000
#define NRBUCKETS (1 << 16)
#define VALBIT 15
int v1[NMAXX], v2[NMAXX], frecv[NRBUCKETS], indici[NRBUCKETS];
inline int nrbucket( int val ) {
return val >> VALBIT;
}
void qsort( int v[], int begin, int end ) {
int b = begin, e = end, pivot = v[(begin + end) / 2], aux;
while ( v[b] < pivot ) {
b++;
}
while ( v[e] > pivot ) {
e--;
}
while ( b < e ) {
aux = v[b];
v[b] = v[e];
v[e] = aux;
do {
b++;
} while ( v[b] < pivot );
do {
e--;
} while ( v[e] > pivot );
}
if ( begin < e ) {
qsort( v, begin, e );
}
if ( e + 1 < end ) {
qsort( v, e + 1, end );
}
}
int main()
{
FILE *fin, *fout;
int n, i, buck;
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++ ) {
buck = nrbucket( v1[i] );
frecv[buck]++;
}
for ( i = 1; i < NRBUCKETS; i++ )
indici[i] = indici[i - 1] + frecv[i - 1];
for ( i = 0; i < n; i++ ) {
buck = nrbucket( v1[i] );
v2[indici[buck]] = v1[i];
indici[buck]++;
}
qsort( v2, indici[0] - frecv[0], indici[1] - 1 );
for ( i = 1; i < NRBUCKETS; i++ ) {
if ( frecv[i] != 0 ) {
qsort( v2, indici[i - 1] - frecv[i - 1], indici[i] - 1 );
}
}
for ( i = 0; i < n; i++ ) {
fprintf( fout, "%d ", v2[i] );
}
fclose( fin );
fclose( fout );
return 0;
}