Cod sursa(job #651707)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 21 decembrie 2011 09:12:08
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
using namespace std;

ifstream fi ("algsort.in");
ofstream fo ("algsort.out");

const int dim = 500005;
int N, A[dim];

void cit ()
{
	fi >> N;
	for (int i = 1; i <= N; i++)
		fi >> A[i];
}

void upheap (int H[])
{
	int f = H[0], t = H[0] >> 1;
	while (t != 0 && H[f] > H[t])
	{
		swap (H[t], H[f]);
		
		f = t;
		t = f >> 1;
	}	
}

void downheap (int H[])
{
	int t = 1, f = 2;
	if (3 <= H[0] && H[3] > H[2])
		f++;
	while (f <= H[0] && H[f] > H[t])
	{
		swap (H[t], H[f]);
		
		t = f;
		f = t << 1;
		if (f+1 <= H[0] && H[f+1] > H[f])
			f++;
	}
}

void heapsort (int *A, int *B)
{
	int H[dim];
	for (H[0] = 1; H[0] <= B - A; H[0]++)
	{
		H[H[0]] = A[H[0]-1];
		upheap (H);
	}
	H[0]--;
	while (H[0] > 0)
	{
		A[H[0]-1] = H[1];
		H[1] = H[H[0]--];
		downheap (H);
	}
}

void afi ()
{
	for (int i = 1; i <= N; i++)
		fo << A[i] << ' ';
}	

int main ()
{
	cit ();
	heapsort (A + 1, A + N + 1);
	afi ();
	return 0;
}