Cod sursa(job #362768)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 10 noiembrie 2009 22:07:05
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 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 idmin;
	while(1)
	{
		idmin = poz;
		if(2 * poz <= lh) if(h[2 * poz] < h[poz]) idmin = 2 * poz;	
		if(2 * poz + 1 <= lh) if(h[2 * poz + 1] < h[idmin]) idmin = 2 * poz + 1;	
		if(idmin != poz)
		{
			interschimba(h[idmin], h[poz]);
			poz = idmin;
		}
		else break;
	}
}

void urca_in_heap(int poz)
{
	while(poz > 1)
	{
		if(h[poz >> 1] > h[poz])
		{
			interschimba(h[poz >> 1], h[poz]);
			poz = poz >> 1;
		}		
		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;
}