Cod sursa(job #2451385)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 26 august 2019 16:17:39
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 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("algsort.in");
    std::ofstream fout("algsort.out");

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

    radix_sort(V);

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

    return 0;
}

void radix_sort(std::vector<unsigned int> &V)
{
    int d;
    std::vector<unsigned int> temp_V(V.size());
    std::vector<unsigned int> digit_counts(257);

    for (unsigned int pos = 0; pos < 32; pos += 8)
    {
        temp_V.swap(V);

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

        for (auto v : temp_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 : temp_V)
        {
            d = (v >> pos) & 255;

            V[digit_counts[d]] = v;

            digit_counts[d] += 1;
        }
    }
}

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

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

    for (size_t i = 0; i < V.size(); ++i)
    {
        in >> V[i];
    }

    return V;
}