Cod sursa(job #738596)

Utilizator galbenugalbenu dorin galbenu Data 21 aprilie 2012 01:38:24
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#include<cstdlib>
#define in "r"
#define out "w"
#define lmax 500050
using namespace std;
FILE *f=fopen("algsort.in",in),*g=fopen("algsort.out",out);
int n,a[lmax],i;
int lefts(int );
int rights(int );
void read()
{
    int i;
    fscanf(f,"%d",&n);
    for(i=1; i<=n; i++)
        fscanf(f,"%d",&a[i]);
}
inline int lefts(int n)
{
    return 2*n;
}
inline int rights(int n)
{
    return 2*n+1;
}
inline int  father(int n)
{
    return n/2;
}
void schimbint (int &a,int &b)
{
    int aux;
    aux=a;
    a=b;
    b=aux;
}
void move_down(int x)
{
    if((rights(x))<=n)
    {
        if(a[rights(x)]>a[x] && a[rights(x)]>=a[lefts(x)])
            schimbint (a[x],a[rights(x)]),move_down(rights(x));
        else if(a[lefts(x)]>a[x])
            schimbint (a[x],a[lefts(x)]),move_down(lefts(x));
    }
    else if(lefts(x)<=n && a[x]<a[lefts(x)])
        schimbint (a[x],a[lefts(x)]),move_down(lefts(x));

}
void build_heap()
{
    int i;
    for(i=n/2; i>=1; i--)
        move_down(i);
}
void show_heap()
{
    int i;
    for(i=1; i<=n; i++)
        fprintf(g,"%d ",a[i]);
}
void heapsort(int &n)
{
    int i,nn=n;
    build_heap();
    for(i=nn; i>=2; i--)
    {
        schimbint (a[i],a[1]);
        n--;
        move_down(1);
    }
    n=nn;
}
int  main()
{
    read();
    heapsort(n);
    show_heap();
    fclose(f);
    fclose(g);
    return 0;
}