Pagini recente » Cod sursa (job #421009) | Cod sursa (job #316482) | Cod sursa (job #1423774) | Cod sursa (job #2852401) | Cod sursa (job #1785988)
//RadixSort
#include <fstream>
using namespace std;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
#define NMAX 10000000
typedef struct {
unsigned content[NMAX+5];
unsigned first;
unsigned last;
void enq(unsigned val) {
if(last == NMAX)
fout<<"Coada plina!";
else
content[++last] = val;
}
unsigned deq() {
if(first > last) {
fout<<"Coada vida!";
return 0; //
}
else {
unsigned val = content[first];
first++;
return val;
}
}
} QUEUE;
unsigned N, A, B, C;
unsigned v[NMAX], i, j, k;
unsigned maxim, nr_ciclii, x;
QUEUE queues[11];
unsigned cifraI(unsigned X, unsigned i) {
while(X > 0 && i > 1) {
X /= 10;
i--;
}
return X%10;
}
int main()
{
fin>>N>>A>>B>>C;
v[1] = B;
for(i = 2 ; i <= N ; i++)
v[i] = (A * v[i-1] + B) % C;
maxim = v[i];
for(i = 2 ; i <= N ; i++)
if(maxim < v[i])
maxim = v[i];
nr_ciclii = 0;
while(maxim > 0) { nr_ciclii++; maxim /= 10; }
for(i = 1 ; i <= nr_ciclii; i++) {
//initializam cozile
for(j = 0 ; j < 10 ; j++) {
queues[j].first = 1;
queues[j].last = 0;
}
//introducem elementele in cozile aferente
for(j = 1 ; j <= N ; j++) {
queues[ cifraI(v[j], i) ].enq(v[j]);
}
//concatenam cozile
k = 0;
for(j = 0 ; j < 10 ; j++) {
while(queues[j].first <= queues[j].last)
v[++k] = queues[j].deq();
}
}
for(i = 1 ; i <= N ; i+=10)
fout<<v[i]<<' ';
fin.close();
fout.close();
return 0;
}