Cod sursa(job #793901)

Utilizator AndreyPAndrei Poenaru AndreyP Data 4 octombrie 2012 17:47:46
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#define N_MAX 500000

int N;
int v[N_MAX], vAux[N_MAX];
int count[65536];

template<typename T>
inline void swap(T& x, T& y) {
    T z = x;
    x = y;
    y = z;
}

inline void read() {
    std::ifstream fin("algsort.in");

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

    fin.close();
}

inline void countAndOrder(int N, int src[], int dest[], int shiftBy) {
    static const int radix = 65535;
    memset(count, 0, sizeof(count));

    for (int i = 0; i < N; ++i) {
        ++count[(src[i] >> shiftBy) & radix];
    }
    for (int i = 1; i <= radix; ++i) {
        count[i] += count[i - 1];
    }

    int x, fromFirstBucket = 0;
    for (int i = 0; i < N; ++i) {
        x = (src[i] >> shiftBy) & radix;

        if (x == 0) {
            dest[fromFirstBucket++] = src[i];
        } else {
            dest[count[x - 1]++] = src[i];
        }
    }
}

void radixsort() {
    countAndOrder(N, v, vAux, 0);
    countAndOrder(N, vAux, v, 16);
}

inline void print() {
    std::ofstream fout("algsort.out");

    fout << v[0];
    for (int i = 1; i < N; ++i) {
        fout << ' ' << v[i];
    }
    fout << '\n';

    fout.close();
}

int main() {
    srand(time(NULL));

    read();
    radixsort();
    print();

    return 0;
}