Cod sursa(job #3209184)

Utilizator Sabin1133Padurariu Sabin Sabin1133 Data 2 martie 2024 10:19:43
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

#define MAX_N 10000000
#define MAXDIGITS 10

void _count_sort(int *v, int *new_v, int len, int exp)
{
    int count[MAXDIGITS] = {0};

    for (int i = 0; i < len; ++i)
        count[(v[i] / exp) % 10]++;

    for (int i = 1; i < MAXDIGITS; ++i)
        count[i] += count[i - 1];

    for (int i = len - 1; i >= 0; --i) {
        int &cnt = count[(v[i] / exp) % 10];
        new_v[cnt - 1] = v[i];
        --cnt;
    }

    memcpy(v, new_v, len * sizeof(int));
}

void radix_sort(int *v, int len)
{
    int max_nr = INT_MIN;
    int max_digits;
    int *aux_arr;

    for (int i = 0; i < len; ++i)
        if (v[i] > max_nr)
            max_nr = v[i];

    max_digits = 1 + std::log10(max_nr);

    aux_arr = new int[len];

    for (int i = 0, exp = 1; i < max_digits; ++i, exp *= 10)
        _count_sort(v, aux_arr, len, exp);

    delete[] aux_arr;
}

int main()
{
    int n, a, b, c;
    int v[MAX_N] = {0};

    std::ifstream fin("radixsort.in");

    fin >> n >> a >> b >> c;

    fin.close();

    v[0] = b;
    for (int i = 1; i < n; ++i)
        v[i] = (a * v[i - 1] + b) % c;

    radix_sort(v, n);

    std::ofstream fout("radixsort.out");

    for (int i = 0; i < n; i += 10)
        fout << v[i] << ' ';
    fout << '\n';

    fout.close();
}