Cod sursa(job #2626403)

Utilizator ihorvaldsTudor Croitoru ihorvalds Data 6 iunie 2020 14:15:10
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

long long power(long b, long e) {
    int c = 1;
    for (int i = 0; i < e; i++) {
        c *= b;
    }
    return c;
}

void radix(std::vector<int>& v, int n) {
    int maxVal = -1;
    for (auto i : v) {
        if (maxVal < i)
            maxVal = i;
    }

    long radix = 1 << 12;
    int iterations = (int)(log(maxVal) / log(radix)) + 1;

    std::vector<std::vector<int>> digits(radix);

    for (int i = 1; i <= iterations; i++) {
        int digit = power(radix, i);
        for (int j = 0; j < n; j++) {
            int e = v[j];
            int index = (e % digit) / (digit / radix);
            digits[index].push_back(e);
        }
        v.clear();
        for (auto& bucket : digits) {
            if (!bucket.empty()) {
                for (auto e : bucket)
                    v.push_back(e);
                bucket.clear();
            }
        }
    }
}

int main()
{
    std::ifstream f("radixsort.in");
    std::ofstream g("radixsort.out");
    std::vector<int> v(10000000, 0);

    int n, a, b, c;
    f >> n >> a >> b >> c;

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

    radix(v, n);

    for (int i = 0; i < n; i+=10) {
        g << v[i] << " ";
    }
}