Cod sursa(job #1249415)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 26 octombrie 2014 23:08:49
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

const int NMax = 10000010;
const int radix = 8;
const int base = (1<<radix);
int N, A, B, C;
int v[NMax];
queue <int> Q[2][base];

void Read()
{
    ifstream f("radixsort.in");
    f >> N >> A >> B >> C;
    f.close();
    v[1] = B;
    for (int i = 2; i <= N; ++ i)
        v[i] = (1LL * A * v[i - 1] + 1LL * B) % C;
}

void CreateTest()
{
    N = 7;
    v[1] = (1 << 3);
    for (int i = 2; i <= 7; ++ i)
        v[i] = (v[i - 1] << 4) | (1 << 3);
}

int RadixSort()
{
    CreateTest();
    const int b = base - 1;
    for (int i = 1; i <= N; ++ i)
        Q[0][v[i] & b].push(v[i]);
    int nrpasi = 32 / radix + ((32 % radix != 0) ? 1 : 0);
    int p = 0;
    for (int pas = 1; pas < nrpasi; ++ pas, p = 1 - p)
    {
        for (int rest = 0; rest < base; ++ rest)
            while (!Q[p][rest].empty())
            {
                int x = Q[p][rest].front(); Q[p][rest].pop();
                Q[1 - p][(x >> (pas * radix)) & b].push(x);
            }
    }
    return p;
}

void Write(const int p)
{
    ofstream g ("radixsort.out");
    int nr = 0;
    for (int rest = 0; rest < base; ++ rest)
    {
        while (!Q[p][rest].empty())
        {
            ++ nr;
            if (nr % 10 == 1)
                g << Q[p][rest].front() << " ";
            Q[p][rest].pop();
        }
    }
    g << "\n";
    g.close();
}

int main()
{
    Read();
    int p = RadixSort();
    Write(p);
    return 0;
}