Pagini recente » Cod sursa (job #2980132) | Cod sursa (job #422039) | Cod sursa (job #2886925) | Cod sursa (job #1242552) | Cod sursa (job #2228482)
#include <fstream>
const std::string programName = "radixsort";
const int MAX = 1e7;
void read(int[], int&, int&, int&, int&);
void print(int, int[]);
int getMax(int[], int);
void countSort(int[], int, int);
void radixSort(int[], int);
int main() {
int N, A, B, C;
int v[MAX + 5];
read(v, N, A, B, C);
radixSort(v, N);
print(N, v);
return 0x0;
}
void read(int v[],int &N, int &A, int &B, int &C) {
std::ifstream f(programName + ".in");
f >> N >> A >> B >> C;
v[0] = B;
for (int i = 1; i < N; ++i)
v[i] = (1LL * A * v[i - 1] + B) % C;
}
void print(int N, int v[]) {
std::ofstream g(programName + ".out");
for (int i = 0; i < N; i += 10)
g << v[i] << ' ';
g << "\n";
}
int getMax(int v[], int N) {
int max = v[0];
for (int i = 1; i < N; i++)
if (v[i] > max)
max = v[i];
return max;
}
void countSort(int v[], int N, int exp) {
int output[N];
int count[10] = {0};
for (int i = 0; i < N; ++i)
count[ (v[i]/exp)%10 ]++;
for (int i = 1; i < 10; ++i)
count[i] += count[i - 1];
for (int i = N - 1; i >= 0; --i) {
output[count[ (v[i]/exp)%10 ] - 1] = v[i];
count[ (v[i]/exp)%10 ]--;
}
for (int i = 0; i < N; ++i)
v[i] = output[i];
}
void radixSort(int v[], int N) {
int m = getMax(v, N);
for (int exp = 1; m/exp > 0; exp *= 10)
countSort(v, N, exp);
}