Cod sursa(job #2466025)

Utilizator paul_danutDandelion paul_danut Data 1 octombrie 2019 11:42:03
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <vector>

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

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(std::vector<int>& input)
{
    std::vector<int> temp(input.size(), 0);
    std::vector<int> index;
    std::vector<int> frequence;

    int c, pos;
	for (auto bucket = 0; bucket < 4; bucket++)
	{
        frequence.assign(countsize, 0);
        index.assign(countsize, 0);

        //compute frequencies
        for (auto 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 (auto 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;

	std::vector<int> input(N, 0);

	//generate input
    input[0] = B;
	for (unsigned int i = 1; i < input.size(); i++)
	{
		input[i] = (int)((((long int)A) * ((long int)input[i - 1]) + ((long int)B)) % ((long int)C));
	}

	sort(input);

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

	return 0;
}