Cod sursa(job #2303700)

Utilizator SemetgTemes George Semetg Data 16 decembrie 2018 19:24:49
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <cstring>
#define N_MAX 10000005
#define MAX_BYTE 255
#define BITS(x, nr_b) ((x >> (8 * nr_b)) & MAX_BYTE)
using namespace std;

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

int N;
int a[N_MAX], sol[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] = (1LL * A * a[i - 1] + B) % C;
}

void counting_sort(int byte) {
    int f[MAX_BYTE + 10] = {};
    for (int i { 1 }; i <= N; ++i)
        ++f[BITS(a[i], byte)];
    
    for (int i { 1 }; i <= MAX_BYTE; ++i)
        f[i] += f[i - 1];
    
    for (int i { N }; i; --i) {
        int bit_secv { BITS(a[i], byte) };
        sol[f[bit_secv]--] = a[i];
    }
    
    memcpy(a, sol, sizeof(int) * (N + 5));
}

void radix_sort() {
    for (int i { 0 }; i < 4; ++i)
        counting_sort(i);
}

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

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