Pagini recente » Cod sursa (job #953481) | Cod sursa (job #1278837) | Cod sursa (job #69515) | Cod sursa (job #1839951) | Cod sursa (job #2063895)
#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;
}