Cod sursa(job #1956895)

Utilizator andysoloAndrei Solo andysolo Data 7 aprilie 2017 09:44:50
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <algorithm>
#define NMAX 500000+5

using namespace std;

int N;
int v[NMAX];

void CreateHeap(int);
void HeapUp(int);
void HeapDown(int,int);

void CreateHeap(int k)
{
    for(int i=2; i<=k; i++)
        HeapUp(i);
}

void HeapUp(int j)
{
    if(j==1)
        return;
    else if(v[j]>v[j/2])
    {
        swap(v[j],v[j/2]);
        HeapUp(j/2);
    }
}

void HeapDown(int f,int k)
{
    int st,dr,i;
    if(2*f<=k)
    {
        st=v[2*f];
        if(2*f+1<=k)
            dr=v[2*f+1];
        else dr=st-1;

        if(st>dr)
            i=2*f;
        else i=2*f+1;

        if(v[f]<v[i])
        {
            swap(v[f],v[i]);
            HeapDown(i,k);
        }
    }
}

void HeapSort(int k)
{
    if(k==1)
        return;
    else
    {
        swap(v[1],v[k]);
        HeapDown(1,k-1);
        HeapSort(k-1);
    }
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);

    scanf("%d",&N);

    for(int i=1; i<=N; i++)
        scanf("%d",&v[i]);

    CreateHeap(N);
    HeapSort(N);

    for(int i=1; i<=N; i++)
        printf("%d ",v[i]);

    return 0;
}