Cod sursa(job #663221)

Utilizator dany123Florea Daniel dany123 Data 18 ianuarie 2012 00:23:31
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
//radix sort, fara vector - lsd 17.01.2012
#include<iostream>
#include<fstream>
using namespace std;
const int nmax = 500000;
int v[nmax],n,nr_max=(1<<31);

void citire()
{
	ifstream fin ("algsort.in");
	fin>>n;
	for (int i=1;i<=n;++i)
	{
		fin>>v[i];
		if (v[i]>nr_max)
			nr_max=v[i];
	}
	fin.close();
}

void radix_sort()
{
	//calculam cate cifre are cel mai mare nr
	int nr_cifre=0;
	while (nr_max)
	{
		nr_max/=10;
		++nr_cifre;
	}
	
	int pow10=1;
	
	for (int iter=1;iter<=nr_cifre;++iter) //pt fiecare cifra
	{
		int buckets[10][nmax];
		int indici[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
		//punem elementele in bucketurile coresp dupa ultima cifra, apoi cifra zecilor, sutelor...
		for (int i=1;i<=n;++i) 
		{	
			int cif=(v[i]/pow10)%10; //cifra dupa care sortam
			buckets[cif][++indici[cif]]=v[i];
		}
		//le punem in ordine din bucketuri in vectorul intial
		int i_v=0;
		for (int it=0;it<=9;++it)
			for (int i2=0;i2<=indici[it];++i2)
				v[++i_v]=buckets[it][i2];			
		pow10*=10;
	}
}

void scriere ()
{
	ofstream fout ("algsort.out");
	for (int i=1;i<=n;++i)
		fout<<v[i]<<' ';
	fout.close();
}

int main ()
{
	citire();
	radix_sort();
	scriere();
}