Cod sursa(job #1259493)

Utilizator Liviu0010Oprescu Liviu Liviu0010 Data 10 noiembrie 2014 03:38:59
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
using namespace std;

unsigned int *v;

struct Nod
{
    unsigned int val;
    Nod *pre, *urm;
};

void push(Nod *&l, unsigned int val)
{
    Nod *cl = new Nod;

    if(l == NULL)
    {
        cl->urm = NULL;
        cl->pre = NULL;
        cl->val = val;
        l = cl;
    }
    else
    {
        cl->urm = l;
        cl->pre = NULL;
        cl->val = val;
        l->pre = cl;
        l = l->pre;
    }
}

unsigned int pop(Nod *&l)
{
    unsigned int rez = l->val;

    if(l->pre == NULL)
    {
        delete l;
        l = NULL;
    }
    else
    {
        l = l->pre;
        delete l->urm;
        l->urm = NULL;
    }

    return rez;

}

int main()
{
    Nod *cif[10] = {NULL}, *cifi[10] = {NULL};
    unsigned int n, a, b, c, i, mod=10, div=1, k;
    fstream in("radixsort.in", fstream::in);
    fstream out("radixsort.out", fstream::out);

    in>>n>>a>>b>>c;
    in.close();

    v = new unsigned int[n+1];

    v[0] = v[1] = b;

    for(i = 2; i <= n; i++)
    {
        v[i] = (a*v[i-1] + b)%c;
        if(v[i] > v[0])
            v[0] = v[i];
    }

    while(v[0])
    {
        k = 1;

        for(i=1; i<=n; i++)
            if(cif[v[i]%mod/div] == NULL)
            {
                push(cifi[v[i]%mod/div], v[i]);
                cif[v[i]%mod/div] = cifi[v[i]%mod/div];
            }
            else
                push(cif[v[i]%mod/div], v[i]);

        for(i = 0; i<=9; i++)
        {
            while(cifi[i] != NULL)
                v[k++] = pop(cifi[i]);
            cif[i] = NULL;
        }

        mod *=10;
        div *=10;

        v[0] /=10;
    }

    for(i=1; i<=n; i+=10)
        out<<v[i]<<' ';

    out.close();
}