Pagini recente » Cod sursa (job #3123828) | Cod sursa (job #1946493) | Cod sursa (job #250607) | Cod sursa (job #897862) | Cod sursa (job #2651511)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
void init(std::vector<uint32_t> &nums)
{
std::ifstream fin("radixsort.in");
uint32_t n, A, B, C;
fin >> n >> A >> B >> C;
nums.reserve(n);
nums.push_back(B);
for (int i = 1; i < n; ++i)
nums.push_back((1ULL*A * nums[i - 1] + B) % C);
}
void radix_sort(std::vector<uint32_t>& nums)
{
int count[256] = { 0 };
std::vector<uint32_t> output;
output.resize(nums.size());
for (uint32_t shift = 0, step = 0; shift < 4; ++shift, step += 8)
{
memset(count, 0, sizeof(count));
for (uint32_t i : nums)
count[(i >> step) & 255]++;
for (int i = 1; i < 256; ++i)
count[i] += count[i - 1];
for (int i = nums.size() - 1; i >= 0; --i)
{
int index = (nums[i] >> step) & 255;
output[--count[index]] = nums[i];
}
for (int i = 0; i < nums.size(); ++i)
nums[i] = output[i];
}
}
int main()
{
std::vector<uint32_t> nr;
init(nr);
radix_sort(nr);
std::ofstream fout("radixsort.out");
for (int i = 0; i < nr.size(); i += 10)
fout << nr[i] << ' ';
}