Cod sursa(job #2303664)

Utilizator SemetgTemes George Semetg Data 16 decembrie 2018 18:24:23
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cstring>
#define N_MAX 10000005
using namespace std;

ifstream in("radixsort.in");
ofstream out("radixsort.out");

int N;
int a[N_MAX], b[N_MAX];

void citeste() {
    int A, B, C;
    in >> N >> A >> B >> C;
    
    a[1] = B;
    for (int i { 2 }; i <= N; ++i)
        a[i] = (A * a[i - 1] + B) % C;
}

void counting_sort(int a[], int b[], int64_t ord) {
    int f[15] = {};
    
    for (int i { 1 }; i <= N; ++i)
        ++f[a[i] / ord % 10];
    
    for (int i { 1 }; i < 10; ++i)
        f[i] += f[i - 1];
    
    for (int i { N }; i; --i) {
        int poz = a[i] / ord % 10;
        b[f[poz]--] = a[i];
    }
}

void afiseaza(int a[]) {
    for (int i { 1 }; i <= N; i += 10)
        out << a[i] << ' ';
}

void radix_sort() {
    int maxim { *max_element(a + 1, a + 1 + N) };
    
    int i { 1 };
    for (int64_t p10 { 1 }; maxim / p10; p10 *= 10, ++i)
        if (i & 1)
            counting_sort(a, b, p10);
        else
            counting_sort(b, a, p10);
    
    afiseaza((i & 1) ? a : b);
}

int main() {
    citeste();
    radix_sort();
}