Cod sursa(job #390307)

Utilizator vlad.maneaVlad Manea vlad.manea Data 3 februarie 2010 14:39:00
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
using namespace std;

int ma, *vec[2][65536], A[524288];

int main()
{
	int cifra, N, i, j;

	ifstream fin("algsort.in");
	ofstream fout("algsort.out");

	fin >> N;
	for (i = 0; i < N; ++i)
		fin >> A[i];

	// fac vector0
	for (i = 0; i < 65536; ++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 = A[i] & 65535;

		// 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;
	}

	// initializez vectorul in care voi pune numerele
	for (i = 0; i < 65536; ++i)
	{
		// realoc
		vec[1][i] = (int *)realloc(vec[1][i], sizeof(int));

		// pun
		vec[1][i][0] = 0;
	}

	// pentru fiecare cifra
	for (i = 0; i < 65536; ++i)
	{
		// pentru fiecare element din lista
		for (j = 1; j <= vec[0][i][0]; ++j)
		{
			// aflu cifra
			cifra = A[vec[0][i][j]] >> 16;

			// pun
			++vec[1][cifra][0];

			// realoc
			vec[1][cifra] = (int *)realloc(vec[1][cifra], (vec[1][cifra][0] + 1) * sizeof(int));

			// calculez vectorul
			vec[1][cifra][vec[1][cifra][0]] = vec[0][i][j];
		}
	}

	// pentru fiecare cifra
	for (i = 0; i < 65536; ++i)
	{
		// pentru fiecare element din lista
		for (j = 1; j <= vec[1][i][0]; ++j)
		{
			// scriu numarul
			fout << A[vec[1][i][j]] << ' ';
		}
	}

	for (i = 0; i < 65536; ++i)
	{
		free(vec[0][i]);
		free(vec[1][i]);
	}

	fin.close();
	fout.close();

	return 0;
}