Cod sursa(job #1529566)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 21 noiembrie 2015 01:51:52
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
using namespace std;

const int pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};

void radixSort(int a[], int n) {
    int *b = new int [n];
    vector < int > v[10];

    for(int step = 0; step < 10; ++step) {
        for(int i = 0; i < 10; ++i) {
            v[i].clear();
        }
        if(step % 2 == 0) {
            for(int i = 0; i < n; ++i) {
                int c = (a[i] / pow10[step]) % 10;
                v[c].push_back(a[i]);
            }
            int k = 0;
            for(int i = 0; i < 10; ++i) {
                for(int j = 0; j < (int) v[i].size(); ++j) {
                    b[k++] = v[i][j];
                }
            }
        }
        else {
            for(int i = 0; i < n; ++i) {
                int c = (b[i] / pow10[step]) % 10;
                v[c].push_back(b[i]);
            }
            int k = 0;
            for(int i = 0; i < 10; ++i) {
                for(int j = 0; j < (int) v[i].size(); ++j) {
                    a[k++] = v[i][j];
                }
            }
        }
    }

    delete b;
}

int main() {
    ifstream f("radixsort.in");
    ofstream g("radixsort.out");

    int n, a, b, c;
    f >> n >> a >> b >> c;

    int *v  = new int [n];
    v[0] = b;
    for(int i = 1; i < n; ++i) {
        v[i] = ((1LL * a * v[i - 1]) % c + b) % c;
    }

    radixSort(v, n);

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

    f.close();
    g.close();

    return 0;
}