Cod sursa(job #976134)

Utilizator andrettiAndretti Naiden andretti Data 22 iulie 2013 16:44:23
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
#include<algorithm>
#define maxn 500005
using namespace std;

int n,nh;
int h[maxn];

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&h[i]);
}

void heap_up(int k)
{
    if(k<=1) return;
    int i=k/2;
    if(h[k]>h[i])
    {
        swap(h[k],h[i]);
        heap_up(i);
    }
}

void heap_dw(int k)
{
    int i=2*k;
    if(i<=nh)
    {
        if(i+1<=nh && h[i+1]>h[i]) i++;
        if(h[i]>h[k])
        {
            swap(h[i],h[k]);
            heap_dw(i);
        }
    }
}

void build()
{
    for(int i=1;i<=n;i++) heap_up(i);
}

void heap_sort()
{
    nh=n;
    while(nh>0)
    {
        swap(h[1],h[nh--]);
        heap_dw(1);
    }
}

void print()
{
    for(int i=1;i<=n;i++) printf("%d ",h[i]);
}

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

    read();
    build();
    heap_sort();
    print();

    fclose(stdin);
    fclose(stdout);
    return 0;
}