Cod sursa(job #2228482)

Utilizator Raoul_16Raoul Bocancea Raoul_16 Data 3 august 2018 21:52:28
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#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);
}