Cod sursa(job #282564)

Utilizator cotofanaCotofana Cristian cotofana Data 17 martie 2009 21:57:07
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
#define dim 500100

int n, h[dim], k;

void swap(int &a, int &b)
{
	int t=a;
	a=b;
	b=t;
}

void sift(int x)
{
	int son, rson, lson;
	do
	{
		son=0;
		lson=x<<1;
		rson=(x<<1)+1;
		if (lson<=k) son=lson;
		if (rson<=k && h[lson]<h[rson]) son=rson;
		if (son && h[son]>h[x])
		{
			swap(h[x], h[son]);
			x=son;
		}
		else son=0;
	} while (son);
}

void build_heap()
{
	int i;
	k=n;
	for (i=n/2; i; i--) sift(i);
}

void heap_sort()
{
	build_heap();
	while (k>1)
	{
		swap(h[1], h[k]);
		k--;
		sift(1);
	}
}

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