Cod sursa(job #2063987)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 11 noiembrie 2017 17:53:06
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <math.h>
#define DMAX 10000002
#define BYTE (1<<8) - 1
//numerele generate in ordine crescatoare  (din 10 in 10)

using namespace std;

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

int numere[DMAX], ordonat[DMAX];
int n, a, b, c;//date de intrare
void countSort(int );

void citire(){
    in >> n >>a >> b >> c;
    in.close();
}

void calculNumere(){
    numere[1] = b % c;
    for(int contor = 2; contor <= n; contor++){
        numere[contor] =((1LL*numere[contor - 1] * a) % c + b) % c;
    }
}

void radixSort(){
    for(int i = 0; i < 4; i++){
        countSort(i);
    }
}

void countSort(int k){
    int frecv[BYTE+4];
    memset(frecv, 0, sizeof(frecv));
    for(int i = 1; i <= n; i++){
        frecv[(numere[i] >> (k * 8)) & BYTE]++;
    }
    for(int i = 1; i <= BYTE; i++){
        frecv[i] += frecv[i-1];
    }
    for(int i = n; i >= 1; i--){
        ordonat[frecv[(numere[i] >> (8 * k)) & BYTE]] = numere[i];
        frecv[(numere[i] >> (8 * k)) & BYTE]--;
    }
    for(int i = 1; i <= n; i++){
        numere[i] = ordonat[i];
    }
}

void afisare(){
    for(int i = 1; i <= n; i+= 10){
        out << numere[i] << ' ';
    }
}

int main() {
    citire();
    calculNumere();
    radixSort();
    afisare();
    return 0;
}