Pagini recente » Cod sursa (job #2465389) | Cod sursa (job #2891770) | Cod sursa (job #1863436) | Cod sursa (job #1215096) | Cod sursa (job #663221)
Cod sursa(job #663221)
//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();
}