Cod sursa(job #2466041)

Utilizator paul_danutDandelion paul_danut Data 1 octombrie 2019 12:01:02
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>

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

std::vector<int> input;
std::vector<int> temp;
std::vector<int> index;
std::vector<int> frequence;
std::vector<int>::iterator  m_it;

const int countsize = 256;
const int bucketsize = 8;
const int mask = (1 << bucketsize) - 1;

int computeIndex(int val, int bucket)
{
	return val >> (bucket * bucketsize) & mask;
}

void sort()
{
    int c, pos;
	for (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
        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()
{
    int N;
	int A, B, C;

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

	input.assign(N, 0);
	temp.assign(N, 0);

    input[0] = B;
	for (int i = 1; i < N; ++i)
	{
		input[i] = (1LL * A * input[i - 1] + B) % C;
	}

	sort();

    for (int i = 0; i < N; i += 10)
	{
		g << input[i] << ' ';
	}

	return 0;
}