Pagini recente » Cod sursa (job #2833977) | Cod sursa (job #1882156) | Cod sursa (job #1306320) | Cod sursa (job #2593389) | Cod sursa (job #663214)
Cod sursa(job #663214)
//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();
}