Cod sursa(job #1786088)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 22 octombrie 2016 13:02:59
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

#define NMAX 500000

typedef struct {
    unsigned content[NMAX+5];
    unsigned first;
    unsigned last;

    void enq(unsigned val) {
        if(last == NMAX)
            fout<<"Coada plina!";
        else
            content[++last] = val;
    }

    unsigned deq() {
        if(first > last) {
            fout<<"Coada vida!";
            return 0; //
        }
        else {
            unsigned val = content[first];
            first++;
            return val;
        }
    }
} QUEUE;

unsigned N;
unsigned v[NMAX], i, j, k;
unsigned maxim, nr_ciclii, x;
QUEUE queues[11];

unsigned cifraI(unsigned X, unsigned i) {
    while(X > 0 && i > 1) {
        X /= 10;
        i--;
    }
    return X%10;
}

int main()
{
    fin>>N;

    for(i = 1 ; i <= N ; i++)
        fin>>v[i];

    maxim = v[1];
    for(i = 2 ; i <= N ; i++)
        if(maxim < v[i])
            maxim = v[i];

    nr_ciclii = 0;
    while(maxim > 0) { nr_ciclii++; maxim /= 10; }

    for(i = 1 ; i <= nr_ciclii; i++) {
        //initializam cozile
        for(j = 0 ; j < 10 ; j++) {
            queues[j].first = 1;
            queues[j].last = 0;
        }
        //introducem elementele in cozile aferente
        for(j = 1 ; j <= N ; j++) {
            queues[ cifraI(v[j], i) ].enq(v[j]);
        }
        //concatenam cozile
        k = 0;
        for(j = 0 ; j < 10 ; j++) {
            while(queues[j].first <= queues[j].last)
                v[++k] = queues[j].deq();
        }
    }

    for(i = 1 ; i <= N ; i++)
        fout<<v[i]<<' ';

    fin.close();
    fout.close();

    return 0;
}