Cod sursa(job #1313484)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 10 ianuarie 2015 18:28:59
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include<cstdio>
#include <cstdlib>
using namespace std;

unsigned int rest1,rest2,rest3,rest4;

unsigned int v[10000001],dimv,a,b,c,cifre,dim,n;
struct nod *start[256],*stop[256];

struct nod
{   unsigned int val;
    struct nod *u;
};

void adauga(unsigned int nr, unsigned int poz)
{

    struct nod *p=(struct nod*)malloc(dim);
   stop[poz]->val=nr;
   stop[poz]->u=p;
   stop[poz]=p;
}

void descarca()
{dimv=0;
struct nod* p;
for(int i=0; i<=255; i++)
while(start[i]!=stop[i])
{
    struct nod* p;
    ++dimv;
    v[dimv]=start[i]->val;
    p=start[i]->u;
    free(start[i]);
    start[i]=p;
}
}



int main()
{
    rest1=255;
    rest2=rest1<<8;
    rest3=rest2<<8;
    rest4=rest3<<8;


    dim=sizeof(struct nod);
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
//initializam listele
for(int i=0; i<=255; i++)
{
    start[i]=(struct nod*)malloc(dim);
    stop[i]=start[i];
}
cin>>n>>a>>b>>c;
unsigned int anterior,curent;
anterior=b;
adauga(anterior,(anterior&rest1) );
for(int i=2; i<=n; i++)
{
    curent=(a*anterior+b)%c;
  adauga(curent,(curent&rest1) );
    anterior=curent;
}
descarca();
for(int i=1; i<=n; i++)
    adauga(v[i],(v[i]&rest2));
    descarca();


for(int i=1; i<=n; i++)
    adauga(v[i],(v[i]&rest3));
descarca();

for(int i=1; i<=n; i++)
    adauga(v[i],(v[i]&rest4));
descarca();

for(int i=1; i<=n; i++)if(i%10 == 1)cout<<v[i]<<" ";


    return 0;
}