Cod sursa(job #2506043)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 7 decembrie 2019 13:22:00
Problema Radix Sort Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cstring>

#define NMAX 10000005

using namespace std;

ifstream in("radixsort.in");
ofstream out("radixsort.out");

int N, A, B, C, v[NMAX], output[NMAX];

int Get_Max()
{
    int maxim = 0;
    for(int i = 1; i <= N; i++)
        maxim = max(maxim, v[i]);
}

int Count_Digits(int n)
{
    int digit = 1;
    while(n/=10) digit++;
    return digit;
}

void Read_Data()
{
    in >> N >> A >> B >> C;
    v[1] = B;
    for(int i = 2; i <= N; i++)
        v[i] = ((long long)((A * v[i - 1] % C + B) % C));
}

void Counting_Sort(int digit)
{
    int ten_factor = 1, c_digit = digit, ccnt[10];
    while(--c_digit) ten_factor *= 10;
    memset(ccnt, 0, sizeof ccnt);
    for(int i = 1; i <= N; i++)
    {
        int new_number = (v[i] / ten_factor) % 10;
        ccnt[new_number]++;
    }
    for(int i = 1; i < 10; i++)
        ccnt[i] = ccnt[i] + ccnt[i - 1];
    for(int i = N; i >= 1; i--)
    {
        int new_number = (v[i] / ten_factor) % 10;
        output[ccnt[new_number]] = v[i];
        ccnt[new_number]--;
    }
    for(int i = 1; i <= N; i++)
        v[i] = output[i];
}

void Radix_Sort()
{
    int max_number = Get_Max();
    int max_digits = Count_Digits(max_number);
    for(int i = 1; i <= max_digits; i++)
        Counting_Sort(i);
}

void Print_Sol()
{
    for(int i = 1; i <= N; i+=10)
        out << v[i] << " ";
    out << "\n";
}

int main()
{
    Read_Data();
    Radix_Sort();
    Print_Sol();
    return 0;
}