Cod sursa(job #2466054)

Utilizator paul_danutDandelion paul_danut Data 1 octombrie 2019 12:23:47
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <cstring>

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

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

constexpr int NMAX = 10000001;
int input[NMAX];
int temp[NMAX];
int position[countsize];
int frequence[countsize];

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

void sort(int input[], int N)
{
    int c, pos;
	for (int bucket = 0; bucket < 4; ++bucket)
	{
	    memset(frequence, 0, sizeof(frequence));
	    memset(position, 0, sizeof(position));

        //compute frequencies
        for(int i=0; i < N; ++i)
        {
            c = computeposition(input[i], bucket);
            frequence[c]++;
        }

        //compute positions
        int i, count = frequence[0];
        for (i = 1; i < countsize; ++i)
        {
            if (frequence[i])
            {
                position[i] = count;
                count += frequence[i];
            }
        }

        //move elements
        for(int i=0; i < N; ++i)
        {
            pos = computeposition(input[i], bucket);
            frequence[pos] --;
            temp[position[pos]] = input[i];
            position[pos]++;
        }

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

int main()
{
    int N;
	int A, B, C;

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

	memset(input, 0, sizeof(input));
	memset(temp, 0, sizeof(temp));

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

	sort(input, N);

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

	return 0;
}