Pagini recente » Cod sursa (job #1965029) | Cod sursa (job #1512031) | Cod sursa (job #2410895) | Cod sursa (job #1435957) | Cod sursa (job #1823939)
#include <cstdio>
const int MAX_N = 10000000;
unsigned int v[1+MAX_N], vc[1+MAX_N];
const int NR_BITS = 16;
const int BUCKET = 1 << NR_BITS;
int nr[BUCKET + 1];
inline void split(int n, int e) {
int byte, mask, p;
for(int i = 0; i < BUCKET; ++i)
nr[i] = 0;
mask = BUCKET - 1;
p = e * NR_BITS;
for(int i = 1; i <= n; ++i) {
byte = (v[i] >> p) & mask;
nr[byte + 1]++;
}
for(int i = 1; i < BUCKET; ++i)
nr[i] += nr[i - 1];
for(int i = 1; i <= n; ++i) {
byte = (v[i] >> p) & mask;
vc[nr[byte] + 1] = v[i];
nr[byte]++;
}
for(int i = 1; i <= n; ++i)
v[i] = vc[i];
}
int main() {
int n, a, b, c;
FILE *fin = fopen("radixsort.in", "r");
fscanf(fin, "%d%d%d%d", &n, &a, &b, &c);
fclose(fin);
v[1] = b;
for(int i = 2; i <= n; ++i)
v[i] = (1LL * a * v[i - 1] + b) % c;
for(int i = 0; i < 32 / NR_BITS; ++i)
split(n, i);
FILE *fout = fopen("radixsort.out", "w");
for(int i = 1; i <= n; i = i + 10)
fprintf(fout, "%u ", v[i]);
fclose(fout);
return 0;
}