Cod sursa(job #838144)

Utilizator sebii_cSebastian Claici sebii_c Data 19 decembrie 2012 00:09:15
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <cstring>

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

const int MAXN = 500001;

int mask[] = {0x0000000f, 0x000000f0, 0x00000f00, 0x0000f000,
              0x000f0000, 0x00f00000, 0x0f000000, 0xf0000000};
int id = 0;

int n;
int A[MAXN];
int B[MAXN];

void csort(int maxval)
{
    int C[maxval];
    memset(C, 0, sizeof(C));

    for (int i = 0; i < n; ++i) {
        int val = (A[i] & mask[id]) >> (4 * id);
        C[val]++;
    }
    for (int i = 1; i < maxval; ++i)
        C[i] += C[i - 1];

    for (int i = n - 1; i >= 0; --i) {
        int val = (A[i] & mask[id]) >> (4 * id);
        B[C[val]] = A[i];
        C[val]--;
    }

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

void rsort()
{
    while (id < 8) {
        csort(16);
        id += 1;
    }
}

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

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

    for (int i = 0; i < n - 1; ++i)
        cout << A[i] << " ";
    cout << A[n - 1] << "\n";

    return 0;
}