Cod sursa(job #950908)

Utilizator mihai995mihai995 mihai995 Data 18 mai 2013 17:46:26
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;

const int N = 1e6;
const int B = 16;
const int key = (1 << B) - 1;

int v[N], n;

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

void sort(int* st, int* dr){
    int cnt[1 << B], n = dr - st, *a, *b;

    a = st;
    b = (int*)malloc(n * sizeof(int));

    for (int t = 0 ; t < 32 ; t += B){
        memset(cnt, 0, sizeof(cnt));

        for (int i = 0 ; i < n ; i++)
            ++cnt[ (a[i] >> t) & key ];

        for (int i = (1 << B) - 1 ; i ; i--)
            cnt[i] = cnt[i - 1];

        cnt[0] = 0;
        for (int i = 1 ; i < (1 << B) ; i++)
            cnt[i] += cnt[i - 1];

        for (int i = 0 ; i < n ; i++)
            b[ cnt[ (a[i] >> t) & key ]++ ] = a[i];

        swap(a, b);
    }

    if (a == st)
        return free(b);

    memcpy(v, a, (dr - st) * sizeof(int));
    free(a);
}

int main(){
    in >> n;

    for (int i = 1 ; i <= n ; i++)
        in >> v[i];

    sort(v + 1, v + n + 1);

    for (int i = 1 ; i <= n ; i++)
        out << v[i] << " ";

    out << "\n";

    return 0;
}