Cod sursa(job #870279)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 3 februarie 2013 03:24:43
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstring>

#define MAXRAD 65537
#define MAXN 500005

using namespace std;

typedef unsigned int uint32;

uint32 counts[MAXRAD];
uint32 indexes[MAXRAD];

uint32 in[MAXN];
uint32 out[MAXN];

void radix_pass(uint32 in[], int n, int radix, uint32 out[])
{
    memset(counts, 0, MAXRAD*sizeof(uint32));
    
    for (int i=0; i<n; ++i)
    {
        ++counts[(in[i] >> (16 * radix)) & 0xFFFF];
    }
    
    indexes[0] = 0;
    for (int i=1; i<MAXRAD; ++i)
    {
        indexes[i] = indexes[i-1] + counts[i-1];
    }
    
    for (int i=0; i<n; ++i)
    {
        out[indexes[(in[i] >> (16 * radix)) & 0xFFFF]++] = in[i];
    }
}

int main()
{
    int n;
    fstream fin("algsort.in", fstream::in);
    fstream fout("algsort.out", fstream::out);
    
    fin >> n;
    //cout << n << "\n";
    
    istream_iterator<int> itIn(fin), itEof;
    ostream_iterator<int> itOut(fout, " ");

    copy(itIn, itEof, in);
    //copy(in, in+n, itOut);
    //cout << "\n";
    
    radix_pass(in, n, 0, out);
    radix_pass(out, n, 1, in);
    
    
    copy(in, in+n, itOut);
    fout << "\n";
    
    return 0;
}