Pagini recente » Cod sursa (job #552772) | Cod sursa (job #520359) | Cod sursa (job #2885436) | Cod sursa (job #3145128) | Cod sursa (job #2611765)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
const int NMAX = 10000000;
const int NB = 8;
const int BASE = (1<<NB);
int v[2][NMAX + 1];
int nr[BASE + 1];
int poz[BASE + 1];
int getMaxdigits( int val ) {
int pow = 1, nr = 0;
while( pow < val )
pow = pow * BASE, nr ++;
return nr;
}
int main() {
int n, a, b, c;
fin>>n>>a>>b>>c;
v[0][1] = b;
int maxim = b;
for( int i = 2; i <= n; i ++ )
v[0][i] = (a * v[0][i-1] + b) % c, maxim = max(maxim, v[0][i]);
int nc = getMaxdigits(maxim);
int m = BASE - 1;
for( int k = 0; k < nc; k ++ ) {
int nb = k * NB;
for( int j = 0; j < BASE; j ++ )
nr[j] = 0;
for( int i = 1; i <= n; i ++ ) {
int cif = (v[k & 1][i]>>nb)&m;
nr[cif] ++;
}
poz[0] = 1;
for( int j = 1; j < BASE; j ++ ) {
poz[j] = poz[j - 1] + nr[j - 1];
}
for( int i = 1; i <= n; i ++ ) {
int cif = (v[k & 1][i]>>nb)&m;
v[(k+1) & 1][poz[cif] ++] = v[k & 1][i];
}
}
for( int i = 1; i <= n; i +=10 )
fout<<v[nc & 1][i]<<" ";
return 0;
}