Pagini recente » Cod sursa (job #419879) | Monitorul de evaluare | Cod sursa (job #1667845) | Cod sursa (job #3255372) | Cod sursa (job #2223285)
// 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;
}