Pagini recente » Cod sursa (job #1406911) | Borderou de evaluare (job #2808051) | Cod sursa (job #3261850) | Cod sursa (job #2383107) | Cod sursa (job #2466034)
#include <fstream>
#include <vector>
std::ifstream f("radixsort.in");
std::ofstream g("radixsort.out");
std::vector<unsigned int> input;
std::vector<unsigned int> temp;
std::vector<unsigned int> index;
std::vector<unsigned int> frequence;
std::vector<unsigned int>::iterator m_it;
constexpr unsigned int countsize = 256;
constexpr unsigned int bucketsize = 8;
constexpr unsigned int mask = (1 << bucketsize) - 1;
unsigned int computeIndex(unsigned int val, unsigned int bucket)
{
return val >> (bucket * bucketsize) & mask;
}
void sort()
{
unsigned int c, pos;
for (unsigned int bucket = 0; bucket < 4; bucket++)
{
frequence.assign(countsize, 0);
index.assign(countsize, 0);
//compute frequencies
for (m_it = input.begin(); m_it != input.end(); ++m_it)
{
c = computeIndex(*m_it, bucket);
frequence[c]++;
}
//compute positions
unsigned int i, count = frequence[0];
for (i = 1; i < countsize; i++)
{
if (frequence[i])
{
index[i] = count;
count += frequence[i];
}
}
//move elements
for (m_it = input.begin(); m_it != input.end(); ++m_it)
{
pos = computeIndex(*m_it, bucket);
frequence[pos] --;
temp[index[pos]] = *m_it;
index[pos]++;
}
input.assign(temp.begin(), temp.end());
}
}
int main()
{
unsigned int N;
unsigned int A, B, C;
f >> N >> A >> B >> C;
input.assign(N, 0);
temp.assign(N, 0);
input[0] = B;
for (unsigned int i = 1; i < N; i++)
{
input[i] = (unsigned int)((((long unsigned int)A) * ((long unsigned int)input[i - 1]) + ((long unsigned int)B)) % ((long unsigned int)C));
}
sort();
for (unsigned int i = 0; i < N; i += 10)
{
g << input[i] << ' ';
}
return 0;
}