Cod sursa(job #1052844)

Utilizator deea101Andreea deea101 Data 11 decembrie 2013 20:52:30
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 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=p;
	while(pn==p)
	{
		f1=2*p,f2=2*p+1;
		if(f1>sh) break;
		if(f2>sh) f2=f1;
	
		if(v[h[f1]]<v[h[f2]]) pn=f1;
			else pn=f2;
	
		if(v[h[p]]<=v[h[pn]]) break;
			else
			{
				swap(p,pn);
				ph[h[p]]=p;
				ph[h[pn]]=pn;
				p=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);
	}
}