Cod sursa(job #854487)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 13 ianuarie 2013 17:39:36
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#define nmax 1048576
using namespace std;

int n, H[nmax];

void input()
{
	freopen("algsort.in", "r", stdin);
	scanf("%d", &n);
	for (int i=1; i<=n; ++i)
		scanf("%d", &H[i]);
}

int leftSon(int k)
{
	return 2*k;
}

int rightSon(int k)
{
	return 2*k + 1;
}

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

void sift(int n, int k)
{
	int son;
	do
	{
		son = 0;
		if (leftSon(k) <= n)
		{
			son = leftSon(k);
			if (rightSon(k) <= n)
				if (H[leftSon(k)] < H[rightSon(k)])
					son = rightSon(k);
			if (H[son] <= H[k])
				son = 0;
		}
		
		if (son)
		{
			swap(H[k], H[son]);
			k = son;
		}
	}
	while (son);
}

void buildHeap()
{
	for (int i=n>>1; i>0; --i)
		sift(n, i);
}

void heapSort()
{
	buildHeap();
	for (int i=n; i>1; --i)
	{
		swap(H[1], H[i]);
		sift(i-1, 1);
	}
}

void output()
{
	freopen("algsort.out", "w", stdout);
	for (int i=1; i<=n; ++i)
		printf("%d ", H[i]);
}

int main()
{
	input();
	heapSort();
	output();
	return 0;
}