Cod sursa(job #491166)

Utilizator ChallengeMurtaza Alexandru Challenge Data 10 octombrie 2010 12:22:31
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>

using namespace std;

const char InFile[]="algsort.in";
const char OutFile[]="algsort.out";
const int MaxN=500005;

ifstream fin(InFile);
ofstream fout(OutFile);

int H[MaxN],HSize,n,V[MaxN],x;

inline int parent(int nod)
{
    return nod>>1;
}

inline int left(int nod)
{
    return nod<<1;
}

inline int right(int nod)
{
    return (nod<<1)+1;
}

void heap_up(int nod)
{
    int p=parent(nod);
    while(p>0 && H[p]>H[nod])
    {
        int aux=H[p];
        H[p]=H[nod];
        H[nod]=aux;
        nod=p;
        p=parent(nod);
    }
}

void heap_down(int nod)
{
    while(true)
    {
        int ind=nod;
        int l=left(nod);
        if(l<=HSize)
        {
            if(H[ind]>H[l])
            {
                ind=l;
            }
        }
        int r=right(nod);
        if(r<=HSize)
        {
            if(H[ind]>H[r])
            {
                ind=r;
            }
        }
        if(ind!=nod)
        {
            int aux=H[ind];
            H[ind]=H[nod];
            H[nod]=aux;
            nod=ind;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    fin>>n;
    for(register int i=0;i<n;++i)
    {
        fin>>x;
        H[++HSize]=x;
        heap_up(HSize);
    }
    fin.close();

    for(register int i=0;i<n;++i)
    {
        V[i]=H[1];
        H[1]=H[HSize--];
        heap_down(1);
    }

    for(register int i=0;i<n;++i)
    {
        fout<<V[i]<<" ";
    }
    fout.close();
    return 0;
}