Pagini recente » Cod sursa (job #1959261) | Cod sursa (job #2485497) | Cod sursa (job #2822205) | Cod sursa (job #340336) | Cod sursa (job #650210)
Cod sursa(job #650210)
#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=0; i<N; ++i)
{
scanf ("%ld", &V[i]);
if (V[i]>Max)
{
Max=V[i];
}
}
}
void Print ()
{
freopen ("algsort.out", "w", stdout);
for (long i=0; i<N; ++i)
{
printf ("%ld ", V[i]);
}
}
int main ()
{
Read ();
RadixSort ();
Print ();
return 0;
}