Cod sursa(job #778949)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 16 august 2012 12:30:32
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<algorithm>

using namespace std;

int h[2000002],a[1000002],b[1000002],i,n;

void heapup(int i)
{
    if (i>1)
    {
        if (h[i]>h[i/2])
        {
            int aux;
            aux=h[i];
            h[i]=h[i/2];
            h[i/2]=aux;
            heapup(i/2);
        }
    }
}

void heapdown(int i)
{
    if (h[i*2]!=0&&h[i*2+1]!=0)
    {
        if (h[2*i]>h[i]&&h[2*i+1]<h[2*i])
        {
            int aux;
            aux=h[i];
            h[i]=h[i*2];
            h[i*2]=aux;
            heapdown(i*2);
        }
        if (h[2*i+1]>h[i]&&h[2*i+1]>h[2*i])
        {
            int aux;
            aux=h[i];
            h[i]=h[i*2+1];
            h[i*2+1]=aux;
            heapdown(i*2+1);
        }
    }
    else if (h[i*2]>0&&h[i*2]>h[i]&&h[i*2]*h[i*2+1]==0)
        {
            int aux;
            aux=h[i];
            h[i]=h[i*2];
            h[i*2]=aux;
            heapdown(i*2);
        }
    return;
}
int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for (i=1;i<=n;i++)
    {
        h[i]=a[i];
        heapup(i);
    }
    int m;
    m=n;
    for (i=1;i<=m;i++)
    {
        b[i]=h[1];
        h[1]=h[n];
        n--;
        heapdown(1);
    }
    for (i=m;i>=1;i--)
    {
        printf("%d ",b[i]);
    }
    printf("\n");
    return 0;
}