Cod sursa(job #345226)

Utilizator irene_mFMI Irina Iancu irene_m Data 2 septembrie 2009 11:28:24
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#define t(x)    ((x)/2)
#define fs(x)   ((x)*2)
#define fd(x)   ((x)*2+1)
#define MaxN 500009

long long a[MaxN],heap[MaxN];
int n,m;

void cit()
{
    int i;
    freopen("algsort.in","r",stdin);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%lld",&a[i]);
}

void swap(int x,int y)
{
    int aux=a[x];
    a[x]=a[y];
    a[y]=aux;
}

void reconstituie_heap(int nod)
{
    int max;
    if(fs(nod)<=n && a[fs(nod)]>a[nod])
        max=fs(nod);
    else
        max=nod;
    if(fd(nod)<=n && a[fd(nod)]>a[max])
        max=fd(nod);
    if(max!=nod)
    {
        swap(nod,max);
        reconstituie_heap(max);
    }
}

void construieste_heap()
{
    int i,N=n/2;
    for(i=N;i>0;i--)
        reconstituie_heap(i);
}

void heapsort()
{
    int i;
    m=n;
    construieste_heap();
    for(i=m;i>1;i--)
    {
        swap(1,i);
        n--;
        reconstituie_heap(1);
    }
    n=m;
}

void afis()
{
    int i;
    freopen("algsort.out","w",stdout);
    for(i=1;i<=n;i++)
        printf("%lld ",a[i]);
}

int main()
{
    cit();
    heapsort();
    afis();
    return 0;
}