Pagini recente » Cod sursa (job #1045413) | Cod sursa (job #903188) | Cod sursa (job #401682) | Cod sursa (job #530601) | Cod sursa (job #522776)
Cod sursa(job #522776)
#include <stdio.h>
#include <stdlib.h>
const int BIT_CHUNK = 16;
const int MAX_BITS = 32;
int NO_OF_VALUES;
int BIT_MASK;
int MAX_LEVEL;
void sort(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));
for (i = 0; i < n; ++i)
scanf("%d", &array[i]);
sort(array, n, 0);
for (i = 0; i < n; ++i)
printf("%d ", array[i]);
return 0;
}
void sort(int* array, 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;
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];
int *temp = (int*)malloc(size * sizeof(*temp));
for (i = 0; i < size; ++i) {
int d = array[i];
int k = (d >> level * BIT_CHUNK) & BIT_MASK;
temp[index[k]++] = d;
}
for (i = 0; i < size; ++i)
array[i] = temp[i];
// printf("\n");
free(occurences);
free(index);
free(temp);
if (level < MAX_LEVEL)
sort(array, size, level + 1);
}