Cod sursa(job #253527)

Utilizator AndreyPAndrei Poenaru AndreyP Data 5 februarie 2009 21:50:14
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define N 500010
int h[N];
int n1,n;
inline void swap(int &x,int &y)
{
	int aux=x;
	x=y;
	y=aux;
}
inline int left_son(int x)
{
	return x<<1;
}
inline int right_son(int x)
{
	return (x<<1)+1;
}
inline int father(int x)
{
	return x>>1;
}
void upheap(int k)
{
	int key=h[k];
	while(k>1 && key>h[father(k)])
	{
		h[k]=h[father(k)];
		k=father(k);
	}
	h[k]=key;
}
void downheap(int k)
{
	int son;
	do
	{
		son=0;
		if(left_son(k)<=n1)
		{
			son=left_son(k);
			if(right_son(k)<=n1 && h[son]<h[right_son(k)])
				son=right_son(k);
			if(h[son]<=h[k])
				son=0;
		}
		if(son)
		{
			swap(h[k],h[son]);
			k=son;
		}
	}while(son);
}
inline void citire()
{
	scanf("%d",&n);
	for(n1=1; n1<=n; ++n1)
	{
		scanf("%d",&h[n1]);
		upheap(n1);
	}
}
inline void heap_sort()
{
	--n1;
	while(n1>1)
	{
		swap(h[1],h[n1]);
		--n1;
		downheap(1);
	}
}
inline void scrie()
{
	for(int i=1; i<n; ++i)
		printf("%d ",h[i]);
	printf("%d\n",h[n]);
}
int main()
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	citire();
	heap_sort();
	scrie();
	return 0;
}