Cod sursa(job #838156)

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

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

using namespace std;

const int MAXN = 500001;

int mask[] = {0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000};
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]) >> (8 * 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]) >> (8 * id);
        B[C[val]] = A[i];
        C[val]--;
    }

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

void rsort()
{
    while (id < 4) {
        csort(256);
        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;
}