Cod sursa(job #837945)

Utilizator sebii_cSebastian Claici sebii_c Data 18 decembrie 2012 20:54:39
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>

#include <iostream>

using namespace std;

#define left(x) (2 * (x))
#define right(x) (2 * (x) + 1)

const int MAXN = 500001;

int size;
int A[MAXN];

inline void swap(int i, int j)
{
    int aux = A[i];
    A[i] = A[j];
    A[j] = aux;
}

void heap_up(int x)
{
    A[++size] = x;
    int pos = size;
    while (pos > 1) {
        int par = pos >> 1;
        if (A[par] < A[pos]) {
            swap(par, pos);     
            pos = par;
        } else {
            return;
        }
    }
}

void heap_down(int pos)
{
    while (pos <= size) {
        int f = left(pos);
        if (f <= size) {
            if (f + 1 <= size && A[f + 1] > A[f])
                f++;
            if (A[f] > A[pos]) {
                swap(f, pos);
                pos = f;
            } else {
                return;
            }
        } else {
            return;
        }
    }
}

void hsort()
{
    while (size > 1) {
        swap(1, size);
        size--;
        heap_down(1);
    }
}

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

    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int x; cin >> x;
        heap_up(x);
    }
    hsort();
    for (int i = 1; i < n; ++i)
        cout << A[i] << " ";
    cout << A[n] << '\n';

    return 0;
}