Pagini recente » Cod sursa (job #257012) | Cod sursa (job #390523) | Cod sursa (job #80675) | Cod sursa (job #801399) | Cod sursa (job #2773793)
//sorteaza dupa fiecare cifra a ficarui numar
// complexitate O(kn), k=nr max de cifre al unui nr
#include <fstream>
using namespace std;
ifstream f("radixsort.in");
ofstream g("radixsort.out");
int v[10000001],backet[256],order[10000001];
int main()
{
int n,a,b,c,i,j,t,tail;
f>>n>>a>>b>>c;
//generam numerele (nu ni-se dau)
v[0]=b;
for(i=1;i<n;i++)
v[i]=(1LL*a*v[i-1]+b)%c;
int pow=0;
for(i=1;i<=4;i++)//impartim numerele in cate 4 bucati de cate 8 biti
{
for(j=0;j<=255;j++)
backet[j]=0;
for(j=0;j<n;j++)
{
tail=(v[j]>>pow)&255;
backet[tail]++;//numaram cate "cozi" sunt la fel din fiecare tip
}
backet[0]--;//ca sa inceapa de la 0
for(j=1;j<=255;j++)
backet[j]+=backet[j-1];//pozitia pe care se va afla cel mai mare nr cu "coada" j
for(j=n-1;j>=0;j--)
{
tail=(v[j]>>pow)&255;
order[backet[tail]]=v[j];
backet[tail]--;//urmatorul element cu acceasi coada va fi mai mic
}
for(j=0;j<n;j++)
v[j]=order[j];//actualizam ordinea
pow+=8;
}
for(i=0;i<n;i+=10)
g<<v[i]<<' ';
//Obs: Se poate face si cu 10 backeturi pentru fiecare cifra in loc de 4 bytes.
return 0;
}