Cod sursa(job #663214)

Utilizator dany123Florea Daniel dany123 Data 17 ianuarie 2012 23:42:34
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
//radix sort - lsd 17.01.2012
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
const int nmax = 500001;
int v[nmax],n,nr_max=1<<32-1;

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

vector <int> buckets[10];
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
	{
		//punem elementele in bucketurile coresp dupa ultima cifra, apoi cifra zecilor, sutelor...
		for (int i=1;i<=n;++i) 
			buckets[(v[i]/pow10)%10].push_back(v[i]);
		//le punem in ordine din bucketuri in vectorul intial
		int i_v=0;
		for (int iter=0;iter<=9;++iter)
			for (int i2=0;i2<buckets[iter].size();++i2)
				v[++i_v]=buckets[iter][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();
}