Cod sursa(job #2335055)

Utilizator igsifvevc avb igsi Data 3 februarie 2019 15:59:11
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <vector>
#include <queue>

std::vector<unsigned int> read(std::istream &in);
void radix_sort(std::vector<unsigned int> &V);

int main()
{
    std::ifstream fin("radixsort.in");
    std::ofstream fout("radixsort.out");

    std::vector<unsigned int> V = read(fin);

    radix_sort(V);

    for (size_t i = 0; i < V.size(); i += 10)
        fout << V[i] << ' ';
    fout << std::endl;

    return 0;
}

void sort_by_digit(unsigned int pos, std::vector<unsigned int> &V)
{
    std::vector<unsigned int> copy_V(V);
    std::vector<unsigned int> digit_counts(257, 0);
    int d;

    for (auto v : V)
    {
        d = (v >> pos) & 255;
        digit_counts[d+1] += 1;
    }

    for (size_t i = 1; i < digit_counts.size(); ++i)
        digit_counts[i] += digit_counts[i - 1];

    for (auto v: copy_V)
    {
        d = (v >> pos) & 255;

        V[digit_counts[d]] = v;

        digit_counts[d] += 1;
    }
}

void radix_sort(std::vector<unsigned int> &V)
{
    for (unsigned int pos = 0; pos < 32; pos += 8)
        sort_by_digit(pos, V);
}

std::vector<unsigned int> read(std::istream &in)
{
    int n, a, b, c;
    in >> n >> a >> b >> c;

    std::vector<unsigned int> V(n);

    V[0] = b;
    for (size_t i = 1; i < V.size(); ++i)
    {
        V[i] = (1ll * a * V[i - 1] + b) % c;
    }

    return V;
}