Cod sursa(job #2307277)

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

using namespace std;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
int n, A, B, C;
int v[10000001], out[10000001];
int maxim, nrcif;
long long p;
void det();
void counting_sort(long long p);
int main()
{
    fin>>n;
    fin>>A>>B>>C;
    v[1]=B;
    for(int i=2; i<=n; i++)
    {
        v[i]=(A*v[i-1]+B)%C;
        maxim=max(maxim, v[i]);
    }
    det();
    p=10;
    for(int i=1; i<=nrcif; i++)
    {
        counting_sort(p);
        p*=10;
        for(int i=1; i<=n; i++) v[i]=out[i];
    }
    for(int i=1; i<=n; i+=10) fout<<out[i]<<' ';
    return 0;
}
void counting_sort(long long p)
{
    int poz[10];
    for(int i=0; i<10; i++) poz[i]=0;
    for(int i=1; i<=n; i++)
    {
        int x=(v[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=(v[i]%p)/(p/10);
        out[poz[x]]=v[i];
        poz[x]--;
    }
}
void det()
{
    while(maxim)
    {
        nrcif++;
        maxim/=10;
    }
}