Cod sursa(job #2063786)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 11 noiembrie 2017 14:43:48
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 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
    for(long pozCifra = 1; maxim/pozCifra > 0; pozCifra*=10){
        countSort(pozCifra);
    }
}

void countSort(long pozCifra){
    int frecv[10];
    int ordonat[1000000];
    memset(frecv, 0, sizeof(frecv));
    for(int i = 0; i< n; i++){
        frecv[(numere[i] / pozCifra) % 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] / pozCifra) % 10] - 1] = numere[i];
        frecv[(numere[i] / pozCifra) % 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;
}