Pagini recente » Cod sursa (job #3252102) | Cod sursa (job #3212516) | Cod sursa (job #1913434) | Cod sursa (job #567473) | Cod sursa (job #2092810)
#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