Cod sursa(job #393792)

Utilizator MKLOLDragos Ristache MKLOL Data 9 februarie 2010 22:23:20
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#define Nmax 200010
int h[Nmax],l[Nmax],K,Q,N,o=0;
int tata(int k)
{
    return (k/2);
}
int fiu1(int k)
{
    return 2*k;
}
int fiu2(int k)
{
    return 2*k+1;
}

void swap(int x,int y)
{
    int aux;

    aux=h[x];
    h[x]=h[y];
    h[y]=aux;


}
void afis(int q)
{
    for(int i=1;i<=K;++i)
    printf("%d ",l[h[i]]);
    printf("\n");
}
int up_heap(int k)
{//afis();
    if(k==1)
    return 0;
    int t;
    t=tata(k);
    if(l[h[t]]>l[h[k]])
    {
    swap(k,t);
    up_heap(t);
    }

    return 0;
}

int down_heap(int k)
{//printf("%d\n",k);

    int s1=fiu1(k),s2=fiu2(k);
    if(s1<=K&&s2<=K)
    {
    if(l[h[s1]]<l[h[s2]])
    {
        if(l[h[k]]>l[h[s1]])
        {
            swap(k,s1);
            down_heap(s1);
        }
    }
    else if(s2<=K)
    {
        if(l[h[k]]>l[h[s2]])
        {
            swap(k,s2);
            down_heap(s2);
        }
    }
    }
    else if(s1<=K)
    {
        if(l[h[k]]>l[h[s1]])
        {
            swap(k,s1);
            down_heap(s1);
        }
    }


}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
int x,y;
scanf("%d",&N);
for(int i=1;i<=N;++i)
{   scanf("%d",&l[++o]);
    ++K;
    h[K]=o;
    up_heap(K);
}
for(int i=1;i<=N;++i)
{
    printf("%d ",l[h[1]]);
    h[1]=h[K--];

    down_heap(1);

}
return 0;
}