Pagini recente » Cod sursa (job #2150093) | Cod sursa (job #2398917) | Cod sursa (job #2769109) | Cod sursa (job #1326969) | Cod sursa (job #1320910)
#include<fstream>
using namespace std;
#define B 256
#define MX 500002
struct List_vect
{
int urm[MX], first[B+3], last[B+3], size[B+3] ;
};
int a[MX], i,n ;
List_vect *LstPrec, *LstC;
void push_back(List_vect *L, int ind, int c )
{
if (L->size[c] > 0 )
L->urm[L->last[c] ]= ind; // pastrez legatura cu urmatorul element din lista
else L->first[c]=ind;
L->last[c]= ind;
L->size[c]++;
}
int pop_front(List_vect *L, int c) // c - cifra
{
int i= L->first[c];
L->first[c]=L->urm[L->first[c] ]; // schimb capul cozii
L->size[c]--;
return i;
}
void Clear(List_vect &L )
{
for (int i=0; i<10; i++)
L.first[i]=L.last[i]=L.size[i]= 0;
}
ifstream f1("algsort.in");
ofstream f2("algsort.out");
void radix_s()
{
int i;
long long p=B*B, c1 ;
LstC= new List_vect;
LstPrec= new List_vect;
Clear(*LstPrec);
for (i=1; i<=n; i++)
push_back(LstPrec, i, a[i] % B ); // pun nr in lista precedenta dupa ultima cifra
while (LstPrec->size[0] < n ) // cat nu au fost incluse toate in cutia 0
{
Clear(*LstC);
for (i=0; i<B; i++)
while (LstPrec->size[i] > 0 )
{
int v= pop_front(LstPrec, i );
c1= (a[v])%p/(p/B);
push_back(LstC, v, c1 ); // mutam varful din lista precedenta in cea curenta
} // conform cifrei log10 (p)-1
List_vect *t= LstC;
LstC=LstPrec; // interschimba pointerii
LstPrec= t;
p*=10;
}
}
int main()
{
f1>>n;
for (i=1;i<=n; i++)
f1>>a[i];
radix_s();
for (i=1; i<=n; i++)
f2<<a[ pop_front(LstPrec,0 ) ]<<" ";
f2.close();
return 0;
}