Cod sursa(job #1170772)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 14 aprilie 2014 15:23:59
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#define NMax 500005
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int X[NMax],H[NMax];
int N,NHeap;

void Citire()
{
    fin>>N;
    for(int i=1;i<=N;i++)
        fin>>X[i];
}

void UpHeap(int P)
{
    int F=P/2;
    while(F && H[F]>H[P])
    {
        swap(H[P],H[F]);
        P=F;
        F=P/2;
    }
}

void DownHeap(int P)
{
    int Ok,Son;
    do{
        Ok=1;

        if(2*P+1<=NHeap)
            {
                if(H[2*P]<H[2*P+1])
                    Son=2*P;
                else
                    Son=2*P+1;
                if(H[Son]<H[P])
                    {
                    swap(H[Son],H[P]);
                    P=Son;
                    Ok=0;
                    }
            }
        else
            {
            if(2*P<=NHeap)
                {
                    Son=2*P;
                }
             if(H[Son]<H[P])
                {
                swap(H[Son],H[P]);
                P=Son;
                Ok=0;
                }
            }
      }
    while(!Ok);
}

void ConstruireHeap()
{
    for(int i=1;i<=N;i++)
        {
            int V=X[i];
            H[++NHeap]=V;
            UpHeap(NHeap);
        }
}

void HeapSort()
{
    for(int i=1;i<=N;i++)
    {
        X[i]=H[1];
        H[1]=H[NHeap];
        NHeap--;
        DownHeap(1);
    }
}

void Afisare()
{
    for(int i=1;i<=N;i++)
        fout<<X[i]<<" ";
    fout<<"\n";
}

int main()
{
    Citire();
    ConstruireHeap();
    HeapSort();
    Afisare();
}