Cod sursa(job #1785192)

Utilizator horatiucheval2Horatiu Andrei Cheval horatiucheval2 Data 20 octombrie 2016 22:23:56
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
//sortare cu radix sort
#include <iostream>
#include <fstream>
#include <cmath>

const int MAX = 500000;

class Queue{
private:
    int content[MAX];
    int first;
    int last;
public:
    Queue(){
        first = 0;
        last = -1;
    }

    bool isEmpty(){
        return first > last;
    }

    void enqueue(int val){
        content[++last] = val;
    }

    int dequeue(){
        if(first > last){
            std::cout << "Error: dequeue in empty Queue\n";
            return -1;
        }else{
            int ret = content[first];
            first++;
            return ret;
        }
    }
};

// cifra lui n pe pozitia pos incepand de la dreapta
int nthDigit(int num, int pos){
    return (num / (int)std::pow(10, pos - 1)) % 10;
}

// numarul de cifre al lui n
int nrDigits(int n){
    int k = 0;
    do{
        n /= 10;
        k++;
    }while(n > 0);
    return k;
}

Queue queues[10];

int main(){
    std::ifstream fin("algsort.in");
    std::ofstream fout("algsort.out");

    int n, v[MAX], maxNum = -1, maxLen;
    fin >> n;
    for(int i = 0; i < n; i++){
        fin >> v[i];
        if(v[i] > maxNum){
            maxNum = v[i];
        }
    }
    maxLen = nrDigits(maxNum);

    for(int pos = 1; pos <= maxLen; pos++){
        for(int i = 0; i < n; i++){
            queues[nthDigit(v[i], pos)].enqueue(v[i]);
        }

        int l = 0;
        for(int i = 0; i <= 9; i++){
            while(!queues[i].isEmpty()){
                v[l++] = queues[i].dequeue();
            }
        }
    }

    for(int i = 0; i < n; i++){
        fout << v[i] << " ";
    }


    fin.close();
    fout.close();
    return 0;
}