Pagini recente » Cod sursa (job #537293) | Cod sursa (job #469367) | Cod sursa (job #325907) | Cod sursa (job #140393) | Cod sursa (job #390160)
Cod sursa(job #390160)
#include <fstream>
using namespace std;
int ma, cif[10][524288], *vec[2][10], A[524288];
int main()
{
int cifra, N, i, j, k;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
fin >> N;
for (i = 0; i < N; ++i)
fin >> A[i];
for (i = 0; i < N; ++i)
{
// aflu cifrele pe fiecare pozitie
j = A[i];
for (k = 0; j; j /= 10, ++k)
cif[k][i] = j % 10;
if (k > ma)
ma = k;
}
// fac vector0
for (i = 0; i < 10; ++i)
{
// aloc
vec[0][i] = (int *)malloc(sizeof(int));
// initializez
vec[0][i][0] = 0;
}
// pun in lista dupa ultima cifra
for (i = 0; i < N; ++i)
{
// aflu cifra
cifra = cif[0][i];
// adun la cifra
++vec[0][cifra][0];
// realoc
vec[0][cifra] = (int *)realloc(vec[0][cifra], sizeof(int) * (vec[0][cifra][0] + 1));
// calculez vectorul
vec[0][cifra][vec[0][cifra][0]] = i;
}
// pentru fiecare cifra
for (k = 1; k < ma; ++k)
{
// initializez vectorul in care voi pune numerele
for (i = 0; i < 10; ++i)
{
// realoc
vec[k & 1][i] = (int *)realloc(vec[k & 1][i], sizeof(int));
// pun
vec[k & 1][i][0] = 0;
}
// pentru fiecare cifra
for (i = 0; i < 10; ++i)
{
// pentru fiecare element din lista
for (j = 1; j <= vec[1 ^ (k & 1)][i][0]; ++j)
{
// aflu cifra
cifra = cif[k][vec[1 ^ (k & 1)][i][j]];
// pun
++vec[k & 1][cifra][0];
// realoc
vec[k & 1][cifra] = (int *)realloc(vec[k & 1][cifra], (vec[k & 1][cifra][0] + 1) * sizeof(int));
// calculez vectorul
vec[k & 1][cifra][vec[k & 1][cifra][0]] = vec[1 ^ (k & 1)][i][j];
}
}
}
// pentru fiecare cifra
for (i = 0, k--; i < 10; ++i)
{
// pentru fiecare element din lista
for (j = 1; j <= vec[k & 1][i][0]; ++j)
{
// scriu numarul
fout << A[vec[k & 1][i][j]] << ' ';
}
}
for (i = 0; i < 10; ++i)
{
free(vec[0][i]);
free(vec[1][i]);
}
fin.close();
fout.close();
return 0;
}