Cod sursa(job #1052825)

Utilizator deea101Andreea deea101 Data 11 decembrie 2013 20:36:20
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <fstream>
#define nmax 500001
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int h[nmax],ph[nmax],v[nmax],n,sh;

void swap(int x, int y)
{
	int aux;
	aux=h[x];
	h[x]=h[y];
	h[y]=aux;
}

void perco(int p)
{
	while(v[h[p]]<v[h[p/2]] && p/2)
	{
		swap(p,p/2);
		
		ph[h[p/2]]=p/2;
		ph[h[p]]=p;
		p=p/2;
	}
}

void sift(int p)
{
	int f1=2*p,f2=2*p+1,pn;
	if(f1>sh) return;
	if(f2>sh) f2=f1;
	
	if(v[h[f1]]<v[h[f2]]) pn=f1;
		else pn=f2;
	
	if(v[h[p]]<=v[h[pn]]) return;
		else
		{
			swap(p,pn);
			ph[h[p]]=p;
			ph[h[pn]]=pn;
			sift(pn);
		}
}
int main()
{
	f>>n;
	int i,x;
	for(i=1;i<=n;i++)
	{
		f>>v[i];
		h[++sh]=i;
		ph[i]=sh;
		perco(sh);
	}
	
	while(sh)
	{
		g<<v[h[1]]<<' ';
		h[1]=h[sh]; sh--;
		ph[h[1]]=1;
		sift(1);
	}
}