Cod sursa(job #376723)

Utilizator zenith09lucas eugene zenith09 Data 22 decembrie 2009 13:10:51
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

#define MAXN 500000

//heap
int h[MAXN + 1];
int lh = 0, n;

void interschimba(int& a, int& b)
{
	int aux = a;
	a = b;
	b = aux;
}

void coboara_in_heap(int poz)
{
	int k;
	while(1)
	{
		k = poz;
		if(2 * poz <= lh) if(h[2 * poz] < h[poz]) k = 2 * poz;	
		if(2 * poz + 1 <= lh) if(h[2 * poz + 1] < h[k]) k = 2 * poz + 1;	
		if(k != poz)
		{
			interschimba(h[k], h[poz]);
			poz = k;
		}
		else break;
	}
}

void urca_in_heap(int poz)
{
	while(poz > 1)
	{
		if(h[poz/2] > h[poz])
		{
			interschimba(h[poz/2], h[poz]);
			poz = poz/2;
		}		
		else break;
	}
}


int main()
{
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);
	
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
	{
		scanf("%d", h + i);
		lh++;
		urca_in_heap(lh);
	}
	
	while(lh)
	{
		printf("%d ", h[1]); //minim
		interschimba(h[1], h[lh]);
		lh--;
		coboara_in_heap(1);
	}
	
	return 0;
}