Pagini recente » Cod sursa (job #2829731) | Cod sursa (job #1535931) | Cod sursa (job #1463560) | Cod sursa (job #1756751) | Cod sursa (job #2063789)
#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(long );
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;
}