Cod sursa(job #826739)

Utilizator ChallengeMurtaza Alexandru Challenge Data 1 decembrie 2012 10:30:56
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <cstdio>
#include <cstring>

using namespace std;

const char InFile[]="algsort.in";
const char OutFile[]="algsort.out";
const int MaxN=500111;
const int LogRadix=16;
const int Steps=32/LogRadix;
const int Radix=1<<LogRadix;

ifstream fin(InFile);
FILE *fout=fopen(OutFile,"w");

int N,V[MaxN],Buffer[MaxN],F[Radix];

int main()
{
	fin>>N;
	for(register int i=1;i<=N;++i)
	{
		fin>>V[i];
	}
	fin.close();
	
	int mask=Radix-1;
	int p=0;

	for(register int i=1;i<=N;++i)
	{
		++F[(V[i]&mask)>>p];
	}
	for(register int i=1;i<Radix;++i)
	{
		F[i]+=F[i-1];
	}
	for(register int i=N;i>0;--i)
	{
		Buffer[F[(V[i]&mask)>>p]--]=V[i];
	}
	memset(F,0,sizeof(F));
	for(register int i=1;i<=N;++i)
	{
		V[i]=Buffer[i];
	}
	p+=LogRadix;
	mask<<=LogRadix;
	
	for(register int i=1;i<=N;++i)
	{
		++F[(V[i]&mask)>>p];
	}
	for(register int i=1;i<Radix;++i)
	{
		F[i]+=F[i-1];
	}
	for(register int i=N;i>0;--i)
	{
		Buffer[F[(V[i]&mask)>>p]--]=V[i];
	}
	
	for(register int i=1;i<=N;++i)
	{
		fprintf(fout,"%d ",Buffer[i]);
	}
	fclose(fout);
	return 0;
}