Cod sursa(job #443305)

Utilizator nandoLicker Nandor nando Data 16 aprilie 2010 17:49:12
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <algorithm>
using namespace std;


//<parsing>
FILE* fin=fopen("algsort.in","r");
const unsigned maxb=8192;
char buf[maxb];
unsigned ptr=0;

inline unsigned getInt(){
	unsigned nr=0;
	while(buf[ptr]<'0'||'9'<buf[ptr])
		if(++ptr>=maxb)
			fread(buf,maxb,1,fin),ptr=0;
	while('0'<=buf[ptr]&&buf[ptr]<='9'){
		nr=nr*10+buf[ptr]-'0';
		if(++ptr>=maxb)
			fread(buf,maxb,1,fin),ptr=0;
	}
	return nr;
}
//</parsing>

FILE* fout=fopen("algsort.out","w");

#define MAXN 500005
#define BASE 1000
#define max(a,b) (((a)>(b))?(a):(b))

int n,vec[MAXN],b[MAXN],maxv=-1;

void radixSort(){
	int exp=1;
	while(maxv/exp>0){
		int bucket[BASE]={0};
		for(int i=0;i<n;++i)
			++bucket[vec[i]/exp%BASE];
		for(int i=1;i<BASE;++i)
			bucket[i]+=bucket[i-1];
		for(int i=n-1;i>=0;--i)
			b[--bucket[vec[i]/exp%BASE]]=vec[i];
		for(int i=0;i<n;++i){
			vec[i]=b[i];
		}
		exp*=BASE;
	}
}

int main(){	
	n=getInt();

	for(int i=0;i<n;i++){
		vec[i]=getInt();
		maxv=max(vec[i],maxv);
	}
	
	radixSort();
	
	for(int i=0;i<n;i++){
		fprintf(fout,"%d ",vec[i]);
	}

	fclose(fin);
	fclose(fout);
	return 0;
}