Cod sursa(job #1681519)

Utilizator stud.ubbstud ubb stud.ubb Data 9 aprilie 2016 15:38:03
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#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;
}