Cod sursa(job #1232865)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 24 septembrie 2014 08:58:42
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int i,n,H[500010],a[500010];

inline void HeapUp(int k)
{
    int t;
    if (k<=1) return;
    t=k/2;
    if (H[k]>H[t])
    {
        swap(H[k],H[t]);
        HeapUp(t);
    }
}

inline void BuildH(int nr)
{
    int i;
    for (i=1;i<nr;++i) HeapUp(i);
}

inline void HeapDown(int r,int k)
{
    int St,Dr,i;
    if (2*r<=k)
    {
        St=H[2*r];
        if (2*r+1<=k) Dr=H[2*r+1];
         else Dr=St-1;

        if (St>Dr) i=2*r;
         else i=2*r+1;

        if (H[r]<H[i])
         {
             swap(H[r],H[i]);
             HeapDown(i,k);
         }
    }
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);

    scanf("%d", &n);
    for (i=1;i<=n;++i) scanf("%d", &H[i]);

    BuildH(n);

    for (i=n;i>1;--i)
    {
        swap(H[1],H[i]);
        HeapDown(1,i-1);
    }

    for (i=1;i<=n;++i) printf("%d ", H[i]);

    return 0;
}