Cod sursa(job #745281)

Utilizator gabrielvGabriel Vanca gabrielv Data 10 mai 2012 21:42:37
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
#define NMAX 200000

using namespace std;

int H[NMAX],N;

inline int left_son(int nod)
{
    return nod<<1;
}
inline int right_son(int nod)
{
    return (nod<<1)+1;
}
void swap(int i, int j)
{
    int aux;
    aux=H[i];
    H[i]=H[j];
    H[j]=aux;
}
void sift(int n, int i)
{
    int son;
    do
    {
        son=0;
        if(left_son(i)<=n)
        {
            son=left_son(i);
            if(right_son(i)<=n && H[son]<H[right_son(i)])
                son=right_son(i);
            if(H[son]<H[i])
                son=0;
        }
        if(son)
            swap(i,son);
        i=son;
    }while(son);
}
void cut(int i, int n)
{
    swap(i,n);
    n--;
	sift(n,i);
}
void construct_heap(int n)
{
	int i;
	for(i=n/2;i;i--)
		sift(n,i);
}
void citire()
{
	freopen("algsort.in","r",stdin);
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
		scanf("%d",&H[i]);
}
void afisare()
{
	freopen("algsort.out","w",stdout);
	for(int i=1;i<=N;i++)
		printf("%d ",H[i]);
	printf("\n");
}
void BVO()
{
	construct_heap(N);
	for(int i=1;i<=N;i++)
		cut(1,N+1-i);
}
int main()
{
	citire();
	BVO();
	afisare();
	return 0;
}