Cod sursa(job #1718457)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 17 iunie 2016 22:03:04
Problema Radix Sort Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.73 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 10000001

typedef struct node
{
    unsigned int key;
    struct node *next;
} NodeT;

NodeT* enqueue(NodeT *root, unsigned int key)
{
    if(root == NULL)
    {
        root = (NodeT*) malloc(sizeof(NodeT));
        root->key = key;
        root->next = NULL;
        return root;
    }
    else
    if(key < root->key)
    {
        NodeT *p = (NodeT*) malloc(sizeof(NodeT));
        p->key = key;
        p->next = root;
        root = p;
        return root;
    }
    else root->next = enqueue(root->next, key);

    return root;
}

int main()
{
    FILE *fin, *fout;
    unsigned int N, A, B, C;
    int i, j, k;
    unsigned int* v;
    unsigned char X;
    NodeT *buckets[256], *p, *pa;

    fin = fopen("radixsort.in", "r");
    fout = fopen("radixsort.out", "w");
    fscanf(fin, "%u %u %u %u", &N, &A, &B, &C);
    v = (unsigned int*) malloc(sizeof(unsigned int) * (N+1));

    v[1] = B;
    for(i=2; i<=N; i++)
        v[i] = (1LL * A * v[i-1] + B) % C;

    memset(buckets, 0, sizeof(buckets));

    //buckets[2] = enqueue(buckets[2], 2);  exemplu
    for(i=0; i<4; i++)
    {
        for(j=1; j<=N; j++)
        {
            X = (v[j] >> (8*i)) & 0xFF;
            buckets[X] = enqueue(buckets[X], v[j]);
        }

        k = 1;
        for(j=0; j<256; j++)
        {
            p = buckets[j];
            while(p)
            {
                pa = p;
                v[k] = p->key;
                p = p->next;
                free(pa);
                k++;
            }
            buckets[j] = NULL;
        }

    }

    for(i=1; i<=N; i+=10)
        fprintf(fout, "%u ", v[i]);
    putc('\n', fout);


    fclose(fin);
    fclose(fout);
    free(v);
    return 0;
}