Pagini recente » Cod sursa (job #1737411) | Cod sursa (job #25264) | Cod sursa (job #1779850) | Cod sursa (job #1516282) | Cod sursa (job #2334978)
#include <fstream>
#include <tuple>
#include <vector>
#include <queue>
std::pair<std::vector<unsigned int>, unsigned int> read(std::istream &in);
void radix_sort(std::vector<unsigned int> &V, const unsigned int C);
int main()
{
std::ifstream fin("radixsort.in");
std::ofstream fout("radixsort.out");
std::vector<unsigned int> V;
unsigned int C;
std::tie(V, C) = read(fin);
radix_sort(V, C);
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<std::queue<unsigned int>> buckets(256, std::queue<unsigned int>());
for (auto v : V)
{
int d = (v >> pos) & 255;
buckets[d].push(v);
}
size_t i = 0;
for (auto &Q : buckets)
for (; !Q.empty(); Q.pop(), i += 1)
V[i] = Q.front();
}
void radix_sort(std::vector<unsigned int> &V, const unsigned int C)
{
for (unsigned int pos = 0; pos < 32; pos += 8)
sort_by_digit(pos, V);
}
std::pair<std::vector<unsigned int>, 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 std::make_pair(V, c);
}