Cod sursa(job #826751)

Utilizator ChallengeMurtaza Alexandru Challenge Data 1 decembrie 2012 10:38:59
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 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;
const int MASK=Radix-1;

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();

	for(register int i=1;i<=N;++i)
	{
		++F[V[i]&MASK];
	}
	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]--]=V[i];
	}
	memset(F,0,sizeof(F));
	memcpy(V,Buffer,sizeof(int)*(N+2));
	
	for(register int i=1;i<=N;++i)
	{
		++F[(V[i]>>LogRadix)&MASK];
	}
	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]>>LogRadix)&MASK]--]=V[i];
	}
	
	for(register int i=1;i<=N;++i)
	{
		fprintf(fout,"%d ",Buffer[i]);
	}
	fclose(fout);
	return 0;
}