Pagini recente » Cod sursa (job #2250546) | Cod sursa (job #2035800) | Cod sursa (job #3295058) | Cod sursa (job #285837) | Cod sursa (job #2026235)
#include <iostream>
#include <fstream>
#include <cstring>
#define RADIX_SIZE 8
#define RADIX 0xff
#define get_byte(x) ((x >> (byte * RADIX_SIZE)) & RADIX)
#define NMAX 10000001
using namespace std;
ifstream in("radixsort.in");
ofstream out("radixsort.out");
int A[NMAX], n, a, b, c;
void count_sort(int A[], int B[], int byte) {
int _count[1 << RADIX_SIZE];
int index[1 << RADIX_SIZE];
memset(_count, 0, sizeof(int) * (1 << RADIX_SIZE));
for (int i = 1; i <= n; i++)
_count[get_byte(A[i])]++;
index[0] = 1;
for (int i = 1; i < (1 << RADIX_SIZE); i++)
index[i] = index[i - 1] + _count[i - 1];
for (int i = 1; i <= n; i++)
B[index[get_byte(A[i])]++] = A[i];
}
void radix_sort(int A[]) {
int *temp = new int[n + 1];
for (int byte = 0; byte < 4; ++byte) {
if (byte & 1)
count_sort(temp, A, byte);
else
count_sort(A, temp, byte);
}
delete[] temp;
}
int main() {
in >> n >> a >> b >> c;
in.close();
A[1] = b;
for (int i = 2; i <= n; i++)
A[i] = (a * A[i - 1] + b) % c;
radix_sort(A);
for (int i = 1; i <= n; i += 10)
out << A[i] << " ";
out.close();
return 0;
}