Pagini recente » Cod sursa (job #610875) | Cod sursa (job #1114391) | Cod sursa (job #3289652) | Cod sursa (job #619823) | Cod sursa (job #2679001)
#include <stdio.h>
#define NMAX 500000
#define NR_BUCKETS 128
#define SIZE_BUCKETS (1 << 15)
#define NR_BITS 6
int v1[NMAX], v2[NMAX], f[NR_BUCKETS + 1], 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]) + 1]++;
for (i = 1; i < NR_BUCKETS; i++)
poz[i] = poz[i - 1] + f[i];
for ( i = 0; i < n; i++ )
v2[poz[bucket(v1[i])]++] = v1[i];
for (i = 1; i <= NR_BUCKETS; i++) {
f[i] += f[i - 1];
sort(v2, f[i - 1], f[i] - 1);
}
for (i = 0; i < n; i++)
fprintf(fout, "%d ", v2[i]);
return 0;
}