Pagini recente » Cod sursa (job #2769915) | Cod sursa (job #3182835) | Cod sursa (job #2539081) | Cod sursa (job #626023) | Cod sursa (job #2680787)
#include <stdio.h>
#define NMAX 500000
#define NR_BUCKETS ( 1 << 16 )
#define SIZE_BUCKETS (1 << 15)
#define NR_BITS 15
int v1[NMAX], v2[NMAX], f[NR_BUCKETS], poz[NR_BUCKETS];
int bucket(int val) {
val = val >> NR_BITS;
return val;
}
void sort( int v[], int bo, int eo ) {
int c, b = bo, e = eo, pivot = v[(bo + eo) / 2];
while ( v[b] < pivot )
b++;
while ( v[e] > pivot )
e--;
while ( b < e ) {
c = v[e];
v[e] = v[b];
v[b] = c;
do
b++;
while ( v[b] < pivot );
do
e--;
while ( v[e] > pivot );
}
if ( bo < e )
sort(v, bo, e );
if ( e + 1 < eo )
sort(v, e + 1, eo );
}
int main() {
FILE* fin = fopen("algsort.in", "r");
FILE* fout = fopen("algsort.out", "w");
int n, i;
fscanf( fin, "%d", &n );
for ( i = 0; i < n; i++)
fscanf( fin, "%d", &v1[i] );
for ( i = 0; i < n; i++ )
f[bucket(v1[i])]++;
for (i = 1; i < NR_BUCKETS; i++)
poz[i] = poz[i - 1] + f[i - 1];
for ( i = 0; i < n; i++ )
v2[poz[bucket(v1[i])]++] = v1[i];
sort(v2, 0, poz[0] - 1);
for (i = 1; i < NR_BUCKETS; i++) {
if( f[i] )
sort(v2, poz[i - 1], poz[i] - 1);
}
for (i = 0; i < n; i++)
fprintf(fout, "%d ", v2[i]);
return 0;
}