Cod sursa(job #650209)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 17 decembrie 2011 15:55:17
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <queue>

#define NMax 500003
#define Bits 8
#define NThreads 2

using namespace std;

queue <long> Buckets[NThreads][1<<Bits];
long V[NMax], N, Max, S=1<<Bits;

void Sort (long L, long R, long TID, long Digit)
{
    for (long j=L; j<=R; ++j)
    {
        long Place=((V[j]>>Digit)&255);
        Buckets[TID][Place].push(V[j]);
    }
}

void RadixSort()
{
	for (long i=0; Max; Max>>=Bits, i+=Bits)
	{
	    int Mid=(1+N)/2;
	    Sort (0, Mid, 0, i);
	    Sort (Mid+1, N-1, 1, i);
		long aux=0;
		for (long j=0; j<=255; ++j)
		{
		    for (long TID=0; TID<NThreads; ++TID)
		    {
		        while (!Buckets[TID][j].empty())
                {
                    V[aux++]=Buckets[TID][j].front();
                    Buckets[TID][j].pop ();
                }
		    }
		}
	}
}

void Read ()
{
    freopen ("algsort.in", "r", stdin);
    scanf ("%ld", &N);
    for (long i=1; i<=N; ++i)
    {
        scanf ("%ld", &V[i]);
        if (V[i]>Max)
        {
            Max=V[i];
        }
    }
}

void Print ()
{
    freopen ("algsort.out", "w", stdout);
    for (long i=1; i<=N; ++i)
    {
        printf ("%ld ", V[i]);
    }
}

int main ()
{
	Read ();
    RadixSort ();
	Print ();
	return 0;
}