Cod sursa(job #641063)

Utilizator an_drey_curentandreycurent an_drey_curent Data 27 noiembrie 2011 09:47:17
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
vector<long int>heap(500001,0);
inline long int parinte(long int x)
{return x/2;}
inline long int fiul_stang(long int x)
{return x*2;}
inline long int fiul_drept(long int x)
{return x*2+1;}
void citire(long int &n)
{
	long int i,x;
	f>>n;
	heap.push_back(0);
	for(i=1;i<=n;i++)
	{
		f>>heap[i];
	}
}
void afisare(long int n)
{
	long int i;
	for(i=1;i<=n;i++)
		g<<heap[i]<<' ';
}
void heap_urca(long int x,long int n)
{
	long int ok=0;
	while(ok==0&&fiul_stang(x)<=n)
	{
		ok=1;
		if(fiul_drept(x)<=n&&(heap[x]<heap[fiul_stang(x)]||heap[x]<heap[fiul_drept(x)]))
		{
			ok=0;
			if(heap[fiul_stang(x)]>heap[fiul_drept(x)])
			{
				swap(heap[x],heap[fiul_stang(x)]);
				x=fiul_stang(x);
			}
			else
			{
				swap(heap[x],heap[fiul_drept(x)]);
				x=fiul_drept(x);
			}
		}
		else
			if(heap[x]<heap[fiul_stang(x)]&&fiul_drept(x)>n)
			{
				ok=0;
				swap(heap[x],heap[fiul_stang(x)]);
				x=fiul_stang(x);
			}
	}
}
void heap_mare(long int n)
{
	long int i;
	for(i=n/2;i>=1;i--)
		heap_urca(i,n);
}
void heap_sort(long int n)
{
	long int i;
	for(i=n;i>=1;i--)
	{
		heap_mare(i);
		swap(heap[1],heap[i]);
	}
}
int main()
{
	long int n;
	citire(n);
	heap_sort(n);
	afisare(n);
	f.close();
	g.close();
	return 0;
}