Cod sursa(job #601202)

Utilizator ELHoriaHoria Cretescu ELHoria Data 5 iulie 2011 12:49:49
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

int v[500002] , n;

void swap(int k,int t)
{
	int x = v[t];
	v[t] = v[k]; 
	v[k] = x;
}

void HeapUp(int k)
{
	if(k<=0) return;
	int t = (k-1)/2;
	if(v[k]>v[t])
	{
		swap(k,t);
		HeapUp(t);
	}
}

void BuildH(int k)
{
	for(int i=1;i<k;++i) HeapUp(i);
}

void HeapDw(int r,int k)
{int St, Dr , i;
	if(2*r+1<=k)
	{
	St = v[2*r+1];
	if(2*r+2<=k) Dr = v[2*r+2];
	else Dr = St - 1;

	if(St>Dr) i = 2*r+1;
	else i = 2*r+2;

	if(v[r]<v[i])
		swap(r,i) , 
		HeapDw(i,k);
	}
}

void HeapSort(int k)
{
	while(k>0)
		swap(0,k) , k-- , HeapDw(0,k);
}

int main()
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	scanf("%d",&n);
	for(int i=0;i<n;++i)
		scanf("%d",&v[i]);
	BuildH(n);
	HeapSort(n-1);
	for(int i=0;i<n;++i)
		printf("%d ", v[i]);
	return 0;
}