Pagini recente » Cod sursa (job #1081194) | Cod sursa (job #1095287) | Cod sursa (job #2652339) | Cod sursa (job #707690) | Cod sursa (job #1011977)
#include <fstream>
using namespace std;
int nrCifre (int n)
{
int cnt = 0;
while (n != 0)
{
cnt++;
n /= 10;
}
return cnt;
}
int nrZece (int n)
{
n++;
int p = 1;
for (int i = 0; i < n; i++)
p *= 10;
return p;
}
void swap (int *v, int i, int j)
{
int tmp = v[i];
v[i] = v[j];
v[j] = tmp;
}
int faRost(int n, int i)
{
if (i == 0) return n % 10;
if (i > 0)
while (i--)
n = n / 10;
return n % 10;
}
void radixSort (int *v, int n)
{
// Nr maxim de cifre
int maxim = nrCifre(v[0]);
for (int i = 1; i < n; i++)
if (maxim < nrCifre(v[i]))
maxim = nrCifre(v[i]);
for (int i = 0; i != maxim; i++)
{
// Vectorul de frecventa al cifrelor
int frecventa[10] = {0};
for (int k = 0; k < n; k++)
frecventa[faRost(v[k], i)]++;
// cout << "NR ZECE = " << nrZece(i) << endl;
// for (int k = 0; k < 10; k++)
// cout << " k = " << k << " frecv: " << frecventa[k] << endl;
int cnt = 0;
for (int l = 0; l < 10; l++)
for (int k = 0; k < n; k++)
{
if (faRost(v[k], i) == l)
{
// cout << "LOLOLOL L-am gasit pe " << v[k] << " pe pozitia " << k << " iar ultima cifra e " << l << " contorul e " << cnt << " si il mut pe " << cnt << endl;
swap(v, k, cnt++);
frecventa[l]--;
}
}
//for(int k = 0; k < n; k++)
//cout << k << " -> " << v[k] << endl;
}
}
int main()
{
ifstream cin("algsort.in");
ofstream cout("algsort.out");
int n; cin >> n;
int v[500001];
for(int i = 0; i < n; i++)
cin >> v[i];
radixSort(v, n);
for(int i = 0; i < n; i++)
cout << v[i] << " ";
cin.close();
cout.close();
return 0;
}