Pagini recente » Cod sursa (job #1724756) | Cod sursa (job #2126348) | Cod sursa (job #1531782) | Cod sursa (job #896965) | Cod sursa (job #1259494)
#include<fstream>
using namespace std;
unsigned int *v;
struct Nod
{
unsigned int val;
char ap;
Nod *pre, *urm;
};
void push(Nod *&l, unsigned int val)
{
Nod *cl;
if(l == NULL)
{
cl = new Nod;
cl->urm = NULL;
cl->ap = 1;
cl->pre = NULL;
cl->val = val;
l = cl;
}
else
{
if(l->val == val)
{
l->ap = l->ap+1;
return;
}
cl = new Nod;
cl->urm = l;
cl->pre = NULL;
cl->ap = 1;
cl->val = val;
l->pre = cl;
l = l->pre;
}
}
unsigned int pop(Nod *&l)
{
unsigned int rez = l->val;
if(l->ap > 1)
{
l->ap = l->ap - 1;
return l->val;
}
if(l->pre == NULL)
{
delete l;
l = NULL;
}
else
{
l = l->pre;
delete l->urm;
l->urm = NULL;
}
return rez;
}
int main()
{
Nod *cif[10] = {NULL}, *cifi[10] = {NULL};
unsigned int n, a, b, c, i, mod=10, div=1, k, var;
fstream in("radixsort.in", fstream::in);
fstream out("radixsort.out", fstream::out);
in>>n>>a>>b>>c;
in.close();
v = new unsigned int[n+1];
v[0] = v[1] = b;
for(i = 2; i <= n; i++)
{
v[i] = (a*v[i-1] + b)%c;
if(v[i] > v[0])
v[0] = v[i];
}
while(v[0])
{
k = 1;
for(i=1; i<=n; i++)
{
var = v[i]%mod/div;
if(cif[var] == NULL)
{
push(cifi[var], v[i]);
cif[var] = cifi[var];
}
else
push(cif[var], v[i]);
}
for(i = 0; i<=9; i++)
{
while(cifi[i] != NULL)
v[k++] = pop(cifi[i]);
cif[i] = NULL;
}
mod *=10;
div *=10;
v[0] /=10;
}
for(i=1; i<=n; i+=10)
out<<v[i]<<' ';
out.close();
}