Cod sursa(job #266776)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 26 februarie 2009 08:41:45
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>

#define N 666013

int h[N], dim_heap = 0;
inline void interschimb(int &a, int &b)
{
	int aux = a;
	a = b;
	b = aux;
}

void coboara_in_heap(int poz)
{
	int poz_min;
	while(1)
	{
		poz_min = poz;
		if(h[poz_min] > h[2*poz] && 2*poz <= dim_heap) poz_min = 2*poz;
		if(h[poz_min] > h[2*poz+1] && 2*poz+1 <= dim_heap) poz_min = 2*poz+1;
		if(poz==poz_min) return;
		interschimb(h[poz], h[poz_min]);
		poz = poz_min;
	}
}

void urca_in_heap(int poz)
{
	while(1)
	{
		if(poz == 1) return;
		if(h[poz] < h[poz/2])
		{
			interschimb(h[poz], h[poz/2]);
			poz /= 2;
		}
		else return;
	}
}

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