Cod sursa(job #2049100)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 26 octombrie 2017 20:51:52
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 1e7 + 5;
const int inf = 1e9 + 5;

// solutie cu algoritmul Radix Sort pe cifre;

int N;
int v[NMax];

void radixSort(int);

int main() {
    in>>N;
    for (int i=1;i <= N;++i) {
        in>>v[i];
    }

    int pw = 1;
    for (int i=1;i <= 10;++i) {
        radixSort(pw);
        pw *= 10;
    }

    for (int i=1;i <= N;++i) {
        out<<v[i]<<' ';
    }

    in.close();out.close();
    return 0;
}

// radixSort(pw) - face o sortare dupa a i-a cifra a fiecarui numar,
// unde i este un numar natural astfel incat 10^(i-1) = pw;
void radixSort(int pw) {
    queue<int> Q[10 + 5];
    // cate o coada pentru fiecare cifra de la 0 la 9;

    for (int i=1;i <= N;++i) {
        int digit = v[i]/pw % 10;
        // digit - a i-a cifra a numarului;

        Q[digit].push(v[i]);
    }

    // multimile de numere ordonate din cozi se concateneaza si se obtine un vector
    // care are o ordonare dupa primele i cifre ale numerelor;
    int dim = 0;
    for (int i=0;i <= 9;++i) {
        while (Q[i].size()) {
            v[++dim] = Q[i].front();
            Q[i].pop();
        }
    }
}