Cod sursa(job #784043)

Utilizator PatrikStepan Patrik Patrik Data 4 septembrie 2012 19:59:34
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
	#include<stdio.h>
	#include<algorithm>
	#define MAX 500001 
	using namespace std;
	int n , H[MAX]  , q;
	
	void citire();
	void heapsort();
	void rebuild(int i);
	void build();
	void tipar();
	
	int main()
	{
		citire();
		heapsort();
		tipar();
		return 0;
	}
	
	void citire()
	{
		freopen("algsort.in" , "r" , stdin );
		scanf("%d" , &n );
		for( int i = 1 ; i<= n ; ++i )
			scanf("%d" , &H[i]);
	}
	
	void heapsort()
	{
		q=n;
		build();
		for( int i = n ; i >= 2 ; --i )
		{
			swap(H[i],H[1]);
			q--;
			rebuild(1);
		}
	}
	
	void build()
	{
		for(int i = n/2 ; i ; --i )
			rebuild(i);
	}
	
	void rebuild(int i)
	{
		int max;
		max = i;
		if(H[2*i] > H[max] && 2*i <= q)
			max = 2*i;
		if(H[2*i+1] > H[max] && 2*i+1 <= q)
			max = 2*i+1;
		if(max != i)
		{
			std::swap(H[max],H[i]);
			rebuild(max);
		}
	}
	
	void tipar()
	{
		freopen("algsort.out" , "w"  , stdout );
		for( int i = 1 ; i<= n ; ++i )
			printf("%d " , H[i] );
		
	}