Cod sursa(job #935565)

Utilizator PopdanDanielPopdan Daniel PopdanDaniel Data 4 aprilie 2013 00:32:05
Problema Sortare prin comparare Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.54 kb
// Heap_Bottom_Up.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <stdlib.h>
#define NMAX 50000
// Heap_Top_Down.cpp : Defines the entry point for the console application.
//
int A[NMAX], H[NMAX], m,n;
int ind_min(int a, int b, int c)
{
    int min;
    if(b<=n)
    {
        if(H[a]<H[b])
            min=a;
        else
            min=b;
        if(c<=n)
        {
            if(H[min]>H[c])
                min=c;
        }
        return min;
    }
    else
        return a;
}
int st(int i)
{
    return 2*i;
}
int dr(int i)
{
    return 2*i +1;
}
void RecHeap(int i)
{
    int ind,var;
    ind = ind_min(i,st(i), dr(i));
    if(ind !=i)
    {
        var=H[i];
        H[i]=H[ind];
        H[ind]=var;
        RecHeap(ind);
    }
}
void H_Init()
{
    n=0;
}

int p(int i)
{
    return i/2;
}
void H_Push(int key)
{
    int i,var;
    n++;
    H[n]=key;

    i=n;



    while((i>1) &&(H[p(i)]> H[i]))
    {
        var = H[p(i)];
        H[p(i)]= H[i];
        H[i] = var;
        i=p(i);

    }
}
int H_Pop()
{
    int minim;
    minim =H[1];

    H[1]=H[n];
    n--;
    RecHeap(1);

    return minim;
}
int main()
{
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out" , "w", stdout);
    scanf("%d", &m);
    int i;
    for(i=1; i<=m;i++)
        scanf("%d", &A[i]);
   H_Init();
   for(i=1;i<=m;i++)
       H_Push(A[i]);
    while(n!=0)
   {
   int k = H_Pop();
   printf("%d ",k);
   }
   return 0;
}