Cod sursa(job #2063895)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 11 noiembrie 2017 16:21:11
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <math.h>
#define DMAX 10000001
//numerele generate in ordine crescatoare  (din 10 in 10)

using namespace std;

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

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

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

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

void radixSort(){
     maxim = b;
    for(int i = 0; i < n; i++){
        if(numere[i] > maxim){
            maxim = numere[i];
        }
    }
    //maxim/pozCifra > 0 adica nu depasesc numarul maxim deoarece eu verific pe cifre
    int nrCif = 0;
    while(maxim != 0){
        nrCif++;
        maxim = maxim / 10;
    }
    for(int i = 1; i <= nrCif; i++){
        countSort(i);
    }
}

void countSort(int pozCifra){
    int frecv[10];
    int * ordonat = new int[n];
    memset(frecv, 0, sizeof(frecv));
    int putere = pow(10, pozCifra - 1);
    for(int i = 0; i< n; i++){
        frecv[(numere[i] / putere) % 10]++;
    }
    for(int i = 1; i <= 9; i++){
        frecv[i] += frecv[i-1];
    }
    for(int i = n - 1; i >= 0; i--){
        ordonat[frecv[(numere[i] / putere) % 10] - 1] = numere[i];
        frecv[(numere[i] / putere) % 10]--;
    }
    for(int i = 0; i < n; i++){
        numere[i] = ordonat[i];
    }
}

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

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