Cod sursa(job #837926)

Utilizator sebii_cSebastian Claici sebii_c Data 18 decembrie 2012 20:37:17
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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 && A[pos / 2] < A[pos]) {
        swap(pos / 2, pos);     
        pos >>= 1;
    }
}

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

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 << '\n';

    return 0;
}