Pagini recente » Cod sursa (job #2918612) | Cod sursa (job #1699829) | Cod sursa (job #279074) | Cod sursa (job #1701038) | Cod sursa (job #1793327)
#include<cstdio>
int n,A,B,C,a[10000001],b[10000001],nr[11];
int main()
{
FILE *f=fopen("radixsort.in","r");
fscanf(f,"%d%d%d%d",&n,&A,&B,&C);
int i;
a[1]=B;
for(i=2;i<=n;i++)
a[i]=((long long)A*a[i-1]+B)%C;
int poz,p=1;
for(poz=1;poz<=10;poz++)//poz=pozitzia cifrei pe care o numar
{//1=cifra unitatilor 2=cifra zecilor, 3=cifra sutelor, etc.
//programul asta merge pt. numere de maxim 10 cifre (deci int)
for(i=0;i<=9;i++)nr[i]=0;
for(i=1;i<=n;i++)//numar in nr[x] = cite numere au cifra x-1 pe poz. poz
nr[a[i]/p%10+1]++;
nr[0]=1;
for(i=0;i<=9;i++)nr[i+1]+=nr[i];
//fac totalul pentru a sti pe ce pozitzie voi aduce fiecare set de numere
//mai precis, prima aparitzie a unui numar care contzine cifra i pe pozitzia
// poz va fi la indicele nr[i].
//ideea e ca, dupa ce pun un numar pe pozitzia data de nr[i], il incrementez
//nr[i] ca sa shtiu unde pun urmatorul numarul.
for(i=1;i<=n;i++)
b[nr[a[i]/p%10]++]=a[i];//adica fix ceea ce fac aici
for(i=1;i<=n;i++)//so, in vectorul b le avem grupate pe seturi
a[i]=b[i];//dupa valoarea cifrei de pe pozitzia poz
p*=10;//trec la urmatoarea cifra, de pe urmatoarea pozitzie
}
f=fopen("radixsort.out","w");
for(i=1;i<=n;i+=10)
fprintf(f,"%d ",a[i]);
fprintf(f,"\n");
return 0;
}