Cod sursa(job #412053)

Utilizator laserbeamBalan Catalin laserbeam Data 5 martie 2010 12:24:41
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
// Catalin Balan
// Fri Mar  5 11:56:04 EET 2010
// Radix Sort

#include <cstdio>
#include <cstdlib>
#include <deque>
using namespace std;

#define	NMAX 500003
#define CHUNK 8192
#define SIGMA 1024

#define FIN "algsort.in"
#define FOUT "algsort.out"

char g_buf[CHUNK];
int g_p=CHUNK-1;

inline int get()
{

	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
	{
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;
	}
	return x;
}

int a[NMAX], n, maxim;
deque<int> bucket[SIGMA];


int main(int argv, char ** argc)
{
	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);


	n = get();
	for (int i = 1; i <= n; ++i)
	{
		a[i] = get();
		maxim = max(maxim, a[i]);
	}
	int e = 0;
	int start = 1;
	while (maxim)
	{
		int i, j;
		for (i = start; i <= n; ++i)
		{
			bucket[ (a[i]>>e)&1023 ].push_back(a[i]);
		}
		for (j = 0, i = start-1; j < SIGMA; ++j)
		{
			while (!bucket[j].empty())
			{
				a[++i] = bucket[j].front();
				bucket[j].pop_front();
				//if (a[i]/e == 0) ++start;
			}
		}
		e += 10;
		maxim >>=10;
		

	}
	
	for (int i = 1; i <= n; ++i)
		printf("%d ", a[i]);
	
	return EXIT_SUCCESS;
}