Cod sursa(job #522774)

Utilizator dudu77tTudor Morar dudu77t Data 16 ianuarie 2011 03:00:05
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.53 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;

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