Cod sursa(job #339130)

Utilizator prdianaProdan Diana prdiana Data 8 august 2009 13:34:01
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#define MAXN 2000000

class Heap
{
public:
	int size;
	int h[MAXN]; 
	Heap();
	void makeHeap();
	int getTop();
	void deleteMin();
	void heapSort();
	void heapify(int key);
	void insertElement(int key);
};

Heap::Heap()
{
	size = 0;
}

void swap(int &x,int &y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
}

void Heap::heapify(int key)
{
	while ((h[key]<h[2*key] || h[key]<h[2*key+1]) && 2*key<=size)
	{
		if (2*key+1>size && h[2*key]>h[key])
		{
			swap(h[key],h[2*key]);
			key = 2*key;
		}
		else if (2*key+1>size)
		{
			return;
		}
		else if (h[2*key]>h[2*key+1])
		{
			swap(h[key],h[2*key]);
			key = 2*key;
		}
		else
		{
			swap(h[key],h[2*key+1]);
			key = 2*key + 1;
		}
	}
}

void Heap::insertElement(int key)
{
	size++;
	h[size] = key;
	key = size;
	while (h[key/2] < h[key] && key>1)
	{
		swap(h[key/2],h[key]);
		key/=2;
	}
}

int Heap::getTop()
{
	return h[1];
}

void Heap::deleteMin()
{
	swap(h[1],h[size]);
	size--;
	heapify(1);
}

void Heap::makeHeap()
{
	int i;
	for (i=size/2;i>=1;i--)
	{
		heapify(i);
	}
}

void Heap::heapSort()
{
	int i,sz = size;
	for (i=1;i<=sz;i++)
	{
		deleteMin();
	}
}

int main()
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);

	Heap a;
	int i,n,aux;
	scanf("%d",&n);
	for (i=0;i<n;i++)
	{
		scanf("%d",&aux);
		a.insertElement(aux);
	}

	a.heapSort();
	for (i=1;i<=n;i++)
	{
		printf("%d ",a.h[i]);
	}
	return 0;
}