Cod sursa(job #640749)

Utilizator an_drey_curentandreycurent an_drey_curent Data 26 noiembrie 2011 14:09:15
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 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;
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>>x;
		heap.push_back(x);
	}
}
void afisare(long int n)
{
	long int i;
	for(i=1;i<=n;i++)
		g<<heap[i]<<' ';
}
void heap_mic(long int x,long int n)
{
	long int ok;
	do
	{
		ok=1;
		if((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)]);
			else
				swap(heap[x],heap[fiul_drept(x)]);
			x=parinte(x);
		}
	}while(ok==0&&x!=0);
}
void heap_mic_1(long int x,long int n)
{
	long int ok;
	do
	{
		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)]);
			else
				swap(heap[x],heap[fiul_drept(x)]);
			x=parinte(x);
		}
		else
			if(heap[x]<heap[fiul_stang(x)]&&fiul_drept(x)>n)
			{
				ok=0;
				swap(heap[x],heap[fiul_stang(x)]);
				x=parinte(x);
			}
	}while(ok==0&&x!=0);
}
void heap_mare(long int n)
{
	long int i;
	if(n/2>=1)
	heap_mic_1(n/2,n);
	for(i=n/2-1;i>=1;i--)
		heap_mic(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;
}