Cod sursa(job #1317852)

Utilizator RaileanuCristian Raileanu Raileanu Data 15 ianuarie 2015 11:56:49
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
using namespace std;
#define B 13
#define MX 500002
struct List_vect
        {
            int urm[MX], first[B], last[B],  size[B] ;
        };

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=100, c1 ;

    LstC= new List_vect;
    LstPrec= new List_vect;

    for (i=1; i<=n; i++)
        push_back(*LstPrec, i, a[i] % 10 ); // 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<=9; i++)
            while (LstPrec->size[i] > 0 )
               {
                    int v= pop_front(*LstPrec, i );
                    c1= (a[v])%p/(p/10);
                    push_back(*LstC, v, c1 ); // mutam varful din lista precedenta in cea curenta
               }                                // conform cifrei log10 (p)-1

        swap(LstC, LstPrec);    // copie o lista in alta
        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;
}