Cod sursa(job #391112)

Utilizator avram_florinavram florin constantin avram_florin Data 5 februarie 2010 00:52:17
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<fstream>
#include<cstdlib>
#define MAXN 500001

using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int N,heap[MAXN];

void sift_heap(int heap[],int N,int k)
{
	int son,aux;
	do
	{
		son=0;
		if(2*k<=N)
			{
				son=2*k;
				if(2*k+1<=N&&heap[2*k]<heap[2*k+1])
					son=2*k+1;
				if(heap[son]<=heap[k])
					son=0;
			}
		if(son)
			{
				aux=heap[k];
				heap[k]=heap[son];
				heap[son]=aux;
				k=son;
			}
	}
	while(son);
}

void build_heap(int heap[],int N)
{
	int i;
	for(i=N/2;i;i--)
		sift_heap(heap,N,i);
}

void heapsort()
{
	int i,aux;
	for(i=N;i>=2;i--)
		{
			aux=heap[1];
			heap[1]=heap[i];
			heap[i]=aux;
			sift_heap(heap,i-1,1);
		}
}

int main ()
{
	f>>N;
	int i;
	for(i=1;i<=N;i++)
		f>>heap[i];
	build_heap(heap,N);
	heapsort();
	for(i=1;i<=N;i++)
		g<<heap[i]<<' ';
	g<<'\n';
	f.close();
	g.close();
	return 0;
}