Cod sursa(job #2092810)

Utilizator ArctopusKacso Peter-Gabor Arctopus Data 22 decembrie 2017 13:06:44
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <iostream>
#include <stdio.h>

#define ll long long


using namespace std;

const int NLIM = 1e7 + 10;
const int BUCKNRLIM = 300;

ll N, A, B, C;
int vv[NLIM];
int vv2[NLIM];
int *v = vv;
int *v2 = vv2;
int cnt[BUCKNRLIM];
int cnt2[BUCKNRLIM];
ll x;
int i, j;

ifstream fcin("radixsort.in");
ofstream fcout("radixsort.out");
int main()
{
	ios::sync_with_stdio( false );

	fcin >> N >> A >> B >> C;

	// generate input
	v[0] = B % C;
	for( i = 1; i < N; ++i )
		v[i] = ( (ll)v[i - 1] * A  + B ) % C;	

	int NR = 4;
	int BYTES = 8;
	ll radix = ((1<<BYTES) - 1);
	int BUCKNR = (1<<BYTES);
	for( i = 0; i < NR; ++i )
	{
		//cout << i << "\n";
		memset( cnt, 0, sizeof( cnt ) );
		// counting sort:
		for( j = 0; j < N; ++j )
		{
			//x = ( v[j] >> ( i * BYTES ) ) & radix;
			
			++cnt[(( v[j] >> ( i * BYTES ) ) & radix)];
		}

		
		int sum = 0; cnt2[0] = 0;
		for( j = 1; j < BUCKNR; ++j )
		{
			sum += cnt[j - 1];
			cnt2[j] = sum;
		}		

		// get the numbers from the buckets:
		for( j = 0; j < N; ++j )
		{
			//x = (( v[j] >> ( i * BYTES ) ) & radix);

			v2[cnt2[(( v[j] >> ( i * BYTES ) ) & radix)]++] = v[j];
		}
		

		int* emp = v;
		v = v2;
		v2 = emp;
	}


	for( int i = 0; i < N; ++i )
		if( i % 10 == 0 )
			fcout << v[i] << " ";
	fcout << "\n";

}
//   100 12 38 123
//	10 1 1 100