Pagini recente » Cod sursa (job #2290281) | Cod sursa (job #369034) | Cod sursa (job #2180336) | Cod sursa (job #2328826) | Cod sursa (job #1681522)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("radixsort.in");
ofstream g("radixsort.out");
struct aparitii{
long long v[10]; //foloseste doar cifre de la 0 la 9
};
long long maximSir(long long sir[], long long lungime){
long long maxim=sir[0];
for(int i=1; i <lungime; i++)
if(sir[i]>maxim)
maxim=sir[i];
return maxim;
}
void CitireSir(long long& lungime, long long sir[]){
cout<<"dati lungimea sirului: ";
cin>>lungime;
cout<<"Dati elementele sirului: \m";
for(int i=0; i<lungime; i++)
cin>>sir[i];
}
void CreeazaVectoriAparitii(long long sir[], long long lungime, aparitii AP[], long long& nrVectori){
nrVectori=maximSir(sir, lungime);
long long d[nrVectori+1];
long long dd=10;
d[0]=dd;
dd*=10;
for(int i=1; i<nrVectori; i++){
for(int j=0; j<10; j++)
AP[i].v[j]=0;
d[i]=dd; //ordinul cifrei numarului
dd*=10;
}
//am incarcat toti vectorii;
for(int i=0; i<lungime; i++){
//se parcurge sirul
//luam fiecare element si ii punem cifrele in vectori
long long x=sir[i];
int k=0;
while(x!=0){
AP[nrVectori-k-1].v[x%10]++;
k++;
x/=10;
}
}
//acum avem vectorii incarcati cu numarul de aparitie a cifrelor unitatilor, zecilor, sutelor etc.
//de retinut este ca vectorii e cifre sunt luati in considerare ca pornind de la cifra cea mai semnificativa, mergand spre cifra unitatilor
}
void TiparesteSir(long long sir[], long long lungime){
for(int i=0; i<lungime; i+=10)
g<<sir[i]<<" ";
}
void FormeazaSir(long long sir[], long long& lungime){
long long n, a, b, c;
f>>n>>a>>b>>c;
lungime=n;
sir[0]=b;
int i=1;
while(i<lungime){
sir[i]=(a*sir[i-1]+b)%c;
i++;
}
//TiparesteSir(sir, lungime);
}
void CountingSort(long long lungime, long long sir[]){
long long aux[maximSir(sir, lungime)+1];
int lx=maximSir(sir, lungime)+1;
for(int i=0; i<=lx; i++){
aux[i]=0;
}
for(int i=0; i<lungime; i++){
aux[sir[i]]++;
}
for(int i=1; i<lx; i++){
aux[i]+=aux[i-1];
}
int j=0;
//cauta primul element cu aparitii mai mari decat 0;
while(j<lx && aux[j]==0)
j++; //a gasit pozitia;
int k=j;
while(k<lx){
if(aux[k]>aux[k-1]){
int d=aux[k]-1;
while(d>=0 && d-(aux[k-1]-1)>0){
sir[d]=k;
d--;
}
}
k++;
}
}
int main()
{
long long sir[1000], lungime;
FormeazaSir(sir, lungime);
CountingSort(lungime, sir);
TiparesteSir(sir, lungime);
f.close();
g.close();
return 0;
}