Cod sursa(job #2223285)

Utilizator paul_danutDandelion paul_danut Data 19 iulie 2018 16:57:27
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
// RadixSort.cpp : Defines the entry point for the console application.
#include <fstream>
#include <vector>

std::ifstream f("radixsort.in");
std::ofstream g("radixsort.out");

const unsigned int BUCKETSIZE = 256;

void fillLevel(std::vector<unsigned int> temp1[], std::vector<unsigned int> temp2[],unsigned int bucketNumber)
{
	unsigned int i, index;
	std::vector<unsigned int>::iterator it;


	unsigned int threshold = 1 << bucketNumber* 8;
	for (i = 0; i < BUCKETSIZE; i++)
	{
		for (it = temp1[i].begin(); it != temp1[i].end(); ++it)
		{
			if ((*it) >= threshold)
			{
				index = ((*it) << (3 - bucketNumber) * 8) >> 24;
				temp2[index].push_back(*it);
			}
		}
	}
}

void fillLevel(std::vector<unsigned int> temp[], unsigned int bucketNumber)
{
	unsigned int i, index;
	unsigned int N;
	unsigned int A, B, C;

	f >> N >> A >> B >> C;

	unsigned val = B;

	index = (val << (3 - bucketNumber) * 8) >> 24;
	temp[index].push_back(val);

	for (i = 2; i <= N; i++)
	{
		val = (A * val + B) % C;

		index = (val << (3 - bucketNumber) * 8) >> 24;
		temp[index].push_back(val);
	}
}

void extractValues(std::vector<unsigned int>& result, std::vector<unsigned int> temp[], unsigned int bucketNumber)
{
	std::vector<unsigned int>::iterator it;

	int threshold = 1 << (bucketNumber + 1) * 8;

	for (unsigned int i = 0; i < BUCKETSIZE; i++)
	{
		for (it = temp[i].begin(); it != temp[i].end(); ++it)
		{
			if ((*it) < threshold)
			{
				result.push_back(*it);
			}
		}
	}
}

void clearVector(std::vector<unsigned int> temp[])
{
	for (unsigned int i = 0; i < BUCKETSIZE; i++)
	{
		temp[i].clear();
	}
}

void sort(std::vector<unsigned int>& result)
{
	std::vector<unsigned int> temp1[BUCKETSIZE];
	std::vector<unsigned int> temp2[BUCKETSIZE];

	fillLevel(temp1, 0);
	extractValues(result, temp1, 0);

	fillLevel(temp1, temp2, 1);
	extractValues(result, temp2, 1);
	clearVector(temp1);

	fillLevel(temp2, temp1, 2);
	extractValues(result, temp1, 2);
	clearVector(temp2);

	fillLevel(temp1, temp2, 3);
	extractValues(result, temp2, 3);
}

void printValues(std::vector<unsigned int> result)
{
	std::vector<unsigned int>::iterator it;
	for (it = result.begin(); it != result.end(); it++)
	{
		g << *it << ' ';
	}
}

int main()
{
	std::vector< unsigned int> result;

	sort(result);
	printValues(result);

    return 0;
}