Cod sursa(job #2126180)

Utilizator TudorVersoiuVersoiu Tudor Sorin TudorVersoiu Data 9 februarie 2018 12:23:02
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;
ifstream f("radixsort.in" );
ofstream g("radixsort.out");

int N, cmax;
unsigned int v[10000001];
queue<unsigned int>* groupA;
queue<unsigned int>* groupB;

int NrCif(int x)
{
    int ncif = 0;
    while ( x ) {
        x/=10;
        ncif++;
    }
    return ncif;
}
inline int Cif(int x, int pos) {
    for ( int i=1; i<pos; i++ )
        x /= 10;
    return x%10;
}

void GenerateArray()
{
    int A, B, C;
    f >> N >> A >> B >> C;

    groupA = new queue<unsigned int>[10];
    groupB = new queue<unsigned int>[10];

    int last= B;
    int cifra = Cif(last, 1);

    groupA[cifra].push(last);
    cmax = max(cmax, NrCif(last));

    for ( int i=2; i<=N; i++ ) {
        int number = (A * last + B) % C;
        int cifra = Cif(number, 1);

        groupA[cifra].push(number);
        cmax = max(cmax, NrCif(number));

        last = number;
    }
}


void RadixSort(unsigned int v[], int N)
{
    for ( int nPas=2; nPas<=cmax; nPas++ ) {
        for ( int i=0; i<10; i++ )
        {
            while ( !groupA[i].empty() )
            {
                int x = groupA[i].front();
                groupA[i].pop();

                groupB[Cif(x, nPas)].push(x);
            }
        }
        swap(groupA, groupB);
    }
}


int main()
{
    GenerateArray();
    RadixSort(v, N);

    for ( int i=0; i<10; i++ ) {
        while ( !groupA[i].empty() ) {
            v[++v[0]] = groupA[i].front();
            groupA[i].pop();
        }
        while ( !groupB[i].empty() ) {
            v[++v[0]] = groupB[i].front();
            groupB[i].pop();
        }
    }

    for ( int i=0; i*10+1<=N; i++ )
        g << v[i*10+1] << ' ';
}