Cod sursa(job #2223236)

Utilizator paul_danutDandelion paul_danut Data 19 iulie 2018 14:05:16
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>

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

const int BUCKETSIZE = 32500000;//536870911; //(2^32 - 1)/4

int bucket[BUCKETSIZE];

int inc0 = 1;
int inc8 = 1 << 8;
int inc16 = 1 << 16;
int inc24 = 1 << 24;


void addVal(int bucket[], long int val)
{
	long int bucketNumber = val / BUCKETSIZE;
	long int posInBucket = val % BUCKETSIZE;

	switch (bucketNumber)
	{
		case 0: bucket[posInBucket] += inc0; break;
		case 1: bucket[posInBucket] += inc8; break;
		case 2: bucket[posInBucket] += inc16; break;
		case 3: bucket[posInBucket] += inc24; break;
	}
}

void initializeBuckets(int bucket[])
{
	for (long int i = 0; i < BUCKETSIZE; i++)
	{
		bucket[i] = 0;
	}
}

void printValues(int bucket[], int bucketNumber)
{
	int i, j, count;
	for (i = 0; i < BUCKETSIZE; i++)
	{
		count = (bucket[i] << (3-bucketNumber) * 8) >> 24;
		for (j = 0; j < count; j++)
		{
			g << bucketNumber * BUCKETSIZE + i << ' ';
		}
	}
}

int main()
{
	long int N, A, B, C;
	f >> N >> A >> B >> C;

	long int val = B;
	addVal(bucket, val);

	initializeBuckets(bucket);

	for (long int i = 2; i <= N; i++)
	{
		val = (A * val + B) % C;
		addVal(bucket, val);
	}

	printValues(bucket, 0);
	printValues(bucket, 1);
	printValues(bucket, 2);
	printValues(bucket, 3);

    return 0;
}