Cod sursa(job #443114)

Utilizator space.foldingAdrian Soucup space.folding Data 16 aprilie 2010 01:54:52
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <stdio.h>

using namespace std;

void read (long &n, long v[])
{
    freopen("algsort.in", "r", stdin);
    scanf("%ld", &n);
    for (int i=1; i<=n; ++i)
        scanf("%ld", v+i);
}

void write (long n, long v[])
{
    freopen("algsort.out", "w", stdout);
   //printf("%ld\n", n);
    for (int i=1; i<=n; ++i)
        printf("%ld\n", *(v+i));
}

void fix_heap(long list[], long root, long key, long bound)
{
    long vacant=root;
    while (2*vacant <= bound)
    {
        long larger_child=2*vacant;
        if(larger_child < bound && list[larger_child+1] > list[larger_child])
            larger_child++;

        if(key > list[larger_child])
            break;
        else
            list[vacant] = list[larger_child];
        vacant = larger_child;
    }
    list[vacant] = key;
}

void heap_sort(long n, long v[])
{
    long max;
    for (int i=n/2; i>0; --i)
        fix_heap(v, i, v[i], n);

    for (int i=n; i>1; --i)
    {
        max = v[1];
        fix_heap(v, 1, v[i], i-1);
        v[i]=max;
    }
}

int main()
{
    long v[500001], n;
    read(n, v);
    heap_sort(n, v);
    write(n, v);
    return 0;
}