Cod sursa(job #240123)

Utilizator DastasIonescu Vlad Dastas Data 6 ianuarie 2009 21:30:38
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;

typedef unsigned int uint;

const uint maxn = 500000;
const uint maxsz = 32;
const uint maxd = 16;
const uint maxr = 1 << maxd;
const uint mask = (1 << maxd) - 1;


ifstream in("algsort.in");
ofstream out("algsort.out");

int n;
uint a[maxn];
uint cnt[maxr], off[maxr];

void read()
{
    in >> n;

    for ( int i = 0; i < n; ++i )
        in >> a[i];
}

uint get(uint x, uint nr)
{
    return ((x >> nr) & mask);
}

uint t[maxn];
void sort(uint pass)
{
    for ( uint i = 0; i < maxr; ++i )
        cnt[i] = 0;

    for ( int i = 0; i < n; ++i )
        ++cnt[ get(a[i], pass) ];

    off[0] = 0;
    for ( uint i = 1; i < maxr; ++i )
        off[i] = off[i-1] + cnt[i-1];

    for ( int i = 0; i < n; ++i )
        t[ off[get(a[i], pass)]++ ] = a[i];
    for ( int i = 0; i < n; ++i )
        a[i] = t[i];
}

void radix()
{
    for ( uint i = 0; i < maxsz; i += maxd )
        sort(i);
}

int main()
{
    read();

    radix();

    for ( int i = 0; i < n; ++i )
        out << a[i] << " ";


    return 0;
}