Cod sursa(job #1249435)

Utilizator simaghitaSima Gheorghe Eugen simaghita Data 26 octombrie 2014 23:20:12
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include<queue>

using namespace std;

const int  NMAX= 10000010;
const int r=8;
const int base = ( 1<<r );
int n, a[NMAX],A,B,C,p;
queue <int> q[2][base];
void citire()
{
    int i=1;
    ifstream fin("radixsort.in");
    fin>>n>>A>>B>>C;
    fin.close();
    a[i]=B;
    for(i=2;i<=n;i++)
        a[i]=(A * a[i-1] + B) % C;

}
void RadixSort()
{
    int i,nrpasi,pas,j ;

    nrpasi = 32 / r;
    if(32% r == 1)
        nrpasi += 1;

    const int rest = base-1;
    for(i=1;i<=n;i++)
        q[0][a[i] & rest].push(a[i]);

    p=0;
    for(pas=1 ; pas<nrpasi ; pas++ , p=1-p)
    {
        for(j=0;j < base; j++)
        {
            while(!q[p][j].empty())
            {
                int k=q[p][j].front();
                q[p][j].pop();
                q[1-p][k >> (pas * r) & r].push(k);
            }
        }
    }

}

void afisare()
{
    int i,nr=0;
    ofstream fout("radixsort.out");
    for(i=0;i<base;i++)
    {
        while(!q[p][i].empty())
        {
            nr++;
            if(nr%10 == 1)
                fout<<q[p][i].front()<<" ";
            q[p][i].pop();
        }
    }
    fout<<"\n";
    fout.close();
}
int main()
{
    citire();
    RadixSort();
    afisare();
    return 0;
}