Pagini recente » Cod sursa (job #3158982) | Cod sursa (job #2854194) | Cod sursa (job #1525320) | Cod sursa (job #1116366) | Cod sursa (job #2063987)
#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;
}