Cod sursa(job #244657)

Utilizator alex23alexandru andronache alex23 Data 15 ianuarie 2009 18:30:51
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#define NMAX 500005

using namespace std;

FILE *f = fopen("algsort.in", "r"), *g = fopen("algsort.out", "w");

int a[NMAX], N;

int addHeap(int k, int x)
{
	a[k] = x;
	while (a[k] < a[(k - 1) / 2])
	{
		int aux = a[k];
		a[k] = a[(k - 1) / 2];
		a[(k - 1) / 2] = aux;
		k = (k - 1) / 2;
	}

	return 0;
}

int removeHeap(int k)
{
	a[0] = a[N - k - 1];
	int i = 0;
	/*
	while ((a[i] > a[2 * i +1]) || (a[i] > a[2 * i + 2]))
	{
		if (a[i] > a[2 * i + 1])
		{
			int aux = a[i];
			a[i] = a[2 * i + 1];
			a[2 * i + 1] = aux;
			i = 2 * i + 1;
		}
		else
		{
			int aux = a[i];
			a[i] = a[2 * i + 2];
			a[2 * i + 2] = aux;
			i = 2 * i + 2;
		}
	}
	*/ 
	while ((2 * i + 2 <= N - k - 2) && ((a[i] > a[2 * i + 1]) || (a[i] > a[2 * i + 2])))
	{
		if ((a[i] > a[2 * i + 1]) && (a[i] > a[2 * i + 2]))
		{
			if (a[2 * i + 1] > a[2 * i + 2])
			{
				int aux = a[i];
				a[i] = a[2 * i + 2];
				a[2 * i + 2] = aux;
				i = 2 * i + 2;
			}
			else
			{
				int aux = a[i];
				a[i] = a[2 * i + 1];
				a[2 * i + 1] = aux;
				i = 2 * i + 1;
			}
		}
		else
		{
			if (a[i] > a[2 * i + 1])
			{
				int aux = a[i];
				a[i] = a[2 * i + 1];
				a[2 * i + 1] = aux;
				i = 2 * i + 1;
			}
			else
			{
				int aux = a[i];
				a[i] = a[2 * i + 2];
				a[2 * i + 2] = aux;
				i = 2 * i + 2;
			}
		}
	}
	if ((2 * i + 1 <= N - k - 2) && (a[i] > a[2 * i + 1]))
	{
		int aux = a[i];
		a[i] = a[2 * i + 1];
		a[2 * i + 1] = aux;
		i = 2 * i + 1;
	}

	return 0;
}

int main()
{
	
	fscanf(f, "%d", &N);
	for (int i = 0; i < N; ++i)
	{
		int x;
		fscanf(f, "%d", &x);
		addHeap(i, x);
	}
	fclose(f);
	/*
	for (int i = 0; i < N; ++i)
		printf("%d ", a[i]);
	printf("\n");
	*/

	for (int i = 0; i < N; ++i)
	{
		fprintf(g, "%d ", a[0]);
		removeHeap(i);
		/*
		for (int j = 0; j < N - i - 1; ++j)
			printf("%d ", a[j]);
		printf("\n");
		*/
	}
	fclose(g);

	return 0;
}