Cod sursa(job #522786)

Utilizator dudu77tTudor Morar dudu77t Data 16 ianuarie 2011 04:31:10
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#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 *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));

    for (i = 0; i < n; ++i)
        scanf("%d", &array[i]);

    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) {
    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 = 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;
    }

    free(occurences);
    free(index);

    if (level < MAX_LEVEL)
        return sort(temp, array, size, level + 1);
    return temp;
}