Cod sursa(job #2651511)

Utilizator vali_27Bojici Valentin vali_27 Data 22 septembrie 2020 19:41:48
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#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] << ' ';
}