Cod sursa(job #2307287)

Utilizator st_marianStoica Marian st_marian Data 24 decembrie 2018 11:04:05
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
int n, A, B, C;
int v[10000001], post[10000001];
int maxim, nrcif;
long long p;
void det();
void counting_sort(long long p, int in[], int out[]);
int main()
{
    fin>>n;
    fin>>A>>B>>C;
    v[1]=B;
    for(int i=2; i<=n; i++)
    {
        v[i]=(1ll*A*v[i-1]+B)%C;
        maxim=max(maxim, v[i]);
    }
    det();
    p=10;
    for(int i=1; i<=nrcif; i++)
    {
        if(i%2)
            counting_sort(p, v, post);
        else counting_sort(p, post, v);
        p*=10;
    }
    if(nrcif%2==0)
    {
        for(int i=1; i<=n; i+=10)
        {
            post[i]=v[i];
        }
    }
    for(int i=1; i<=n; i+=10) fout<<post[i]<<' ';
    return 0;
}
void counting_sort(long long p, int in[],int out[])
{
    int poz[10];
    for(int i=0; i<10; i++) poz[i]=0;
    for(int i=1; i<=n; i++)
    {
        int x=(in[i]%p)/(p/10);
        poz[x]++;
    }
    int s=0;
    for(int i=0; i<10; i++)
    {
        s+=poz[i];
        poz[i]=s;
    }
    ///pornim de la n la 1 pentru ca sa fie sortarea corecta
    for(int i=n; i>=1; i--)
    {
        int x=(in[i]%p)/(p/10);
        out[poz[x]]=in[i];
        poz[x]--;
    }
}
void det()
{
    while(maxim)
    {
        nrcif++;
        maxim/=10;
    }
}