Pagini recente » Cod sursa (job #1339335) | Cod sursa (job #540622) | Cod sursa (job #251673) | Cod sursa (job #1468073) | Cod sursa (job #522781)
Cod sursa(job #522781)
#include <stdio.h>
#include <stdlib.h>
const int BIT_CHUNK = 8;
const int MAX_BITS = 32;
int NO_OF_VALUES;
int BIT_MASK;
int MAX_LEVEL;
int **occ;
int *sort(int*, int*, int, int);
int main() {
NO_OF_VALUES = 1 << BIT_CHUNK;
BIT_MASK = NO_OF_VALUES - 1;
MAX_LEVEL = MAX_BITS / BIT_CHUNK - 1;
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
int i, n;
scanf("%d", &n);
int *array = (int*)malloc(n * sizeof(*array));
int *temp = (int*)malloc(n * sizeof( *temp));
occ = (int**)malloc((MAX_LEVEL + 1) * sizeof(*occ));
for (i = 0; i <= MAX_LEVEL; ++i)
occ[i] = (int*)calloc(NO_OF_VALUES, sizeof(*occ[i]));
for (i = 0; i < n; ++i)
scanf("%d", &array[i]);
for (i = 0; i < n; ++i) {
int j;
for (j = 0; j <= MAX_LEVEL; ++j) {
++occ[j][(array[i] >> (j * BIT_CHUNK)) & BIT_MASK];
}
}
int *sorted = sort(array, temp, n, 0);
for (i = 0; i < n; ++i)
printf("%d ", sorted[i]);
return 0;
}
int *sort(int* array, int* temp, int size, int level) {
// printf("%d: ", level);
// int *occurences = (int*)calloc(NO_OF_VALUES, sizeof(*occurences));
int *index = (int*)calloc(NO_OF_VALUES, sizeof( *index));
int i;
int *occurences = occ[level];
// for (i = 0; i < size; ++i)
// ++occurences[(array[i] >> (level * BIT_CHUNK)) & BIT_MASK];
/*
for (i = 0; i < NO_OF_VALUES; ++i)
if (occurences[i])
printf("(%d,%d) ", i, occurences[i]);
*/
for (i = 1; i < NO_OF_VALUES; ++i)
index[i] = index[i - 1] + occurences[i - 1];
for (i = 0; i < size; ++i) {
int d = array[i];
int k = (d >> level * BIT_CHUNK) & BIT_MASK;
temp[index[k]++] = d;
}
// printf("\n");
free(occurences);
free(index);
if (level < MAX_LEVEL)
return sort(temp, array, size, level + 1);
return temp;
}