Cod sursa(job #2271123)

Utilizator mihaicivMihai Vlad mihaiciv Data 28 octombrie 2018 09:12:44
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

void radixSort(int, int *);
int getDigitNumber(int);
int getDigitValue(int, int);

int main() {

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

    radixSort(n, v);

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

    return 0;
}

void radixSort(int n, int *v) {

    queue <int> c[10];

    for (int i = 0; i < 10; ++i) {
        while ( c[i].empty() == 0 ) {
            c[i].pop();
        }
    }



    int maxDigitNumbers = 0;

    for (int i = 0; i < n; ++i) {
        maxDigitNumbers = max(maxDigitNumbers, getDigitNumber(v[i]) );
    }

    for (int i = 1; i <= maxDigitNumbers; ++i) {
        for (int j = 0; j < n; ++j) {
            int currentDigit = getDigitValue(v[j], i);
            c[currentDigit].push(v[j]);
        }
        int pos = 0;
        for (int j = 0; j < 10; ++j) {
            while (c[j].empty() == 0 ) {
                v[pos] = c[j].front();
                pos ++;
                c[j].pop();
            }
        }
    }



}

int getDigitNumber(int x) {

    int digitNumber = 0;
    while (x) {
        x = x / 10;
        digitNumber ++;
    }
    return digitNumber;
}

int getDigitValue(int x, int pos) {
    int currentDigit = 0;
    for (int i = 1; i <= pos; ++i) {
        currentDigit = x % 10;
        x = x / 10;
    }
    return currentDigit;
}