Cod sursa(job #1041797)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 26 noiembrie 2013 09:42:16
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<cstdio>

using namespace std;

int h[500002],a[500002],b[500002],i,n,m;

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

void heapdown(int i)
{
    int aux;
    if (i*2+1<=m)
    {
        if (h[2*i]>h[i]&&h[2*i+1]<=h[2*i])
        {
            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])
        {
            aux=h[i];
            h[i]=h[i*2+1];
            h[i*2+1]=aux;
            heapdown(i*2+1);
        }
    }
    else if (i*2<=m&&i*2+1>m)
        {
            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]);
        h[i]=a[i];
        heapup(i);
    }
    m=n;
    for(i=1;i<=n;i++)
    {
        b[i]=h[1];
        h[1]=h[m];
        m--;
        h[m+1]=0;
        heapdown(1);
    }
    for (i=n;i>=1;i--)
    {
        printf("%d ",b[i]);
    }
    return 0;
}