Cod sursa(job #1414404)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 2 aprilie 2015 16:26:54
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 500000 + 1;

const int DIGITS = 32;
const int R = DIGITS / 4;
const int radix = (1 << R);
const int mask = radix - 1;

int A[Nmax], B[Nmax];
int buckets[radix];
int N;

void sortare()
{
    for (int d = 0; d < DIGITS; d += R)
    {
        int shift = (1 << d) - 1;

        for (int i = 0; i < radix; ++i)
            buckets[i] = 0;

        for (int i = 0; i < N; ++i)
            buckets[ (A[i] >> shift) & mask ]++;

        for (int i = 1; i < radix; ++i)
            buckets[i] += buckets[i - 1];

        for (int i = N - 1; i >= 0; i--)
            B[ --buckets[ (A[i] >> shift) & mask ] ] = A[i];

        for (int i = 0; i < N; ++i)
            A[i] = B[i];
    }
}

int main() {

    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    cin >> N;

    for (int i = 0; i < N; ++i)
        cin >> A[i];

    sortare();

    for (int i = 0; i < N; ++i)
        cout << A[i] << " ";

}