Cod sursa(job #1236186)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 1 octombrie 2014 16:57:57
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[1000010];

void hip (int k, int n)
{
    if ((2 * k + 1 > n || (v[2 * k] >= v[2 * k + 1])) && 2 * k <= n)
    {
        if (v[2 * k] > v[k])
        {
            swap (v[2 * k], v[k]);
            if (2 * k <= n / 2) hip (2 * k, n);
        }
    }

    else if (2 * k + 1 <= n && v[2 * k] < v[2 * k + 1])
    {
        if (v[2 * k + 1] > v[k])
        {
            swap (v[2 * k + 1], v[k]);
            if (2 * k + 1 <= n / 2) hip (2 * k + 1, n);
        }
    }
}

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

    int n;
    scanf ("%d", &n);

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

    for (int i = n / 2; i; --i)
        hip (i, n);

    int cn = n;
    for (; n > 1; --n)
    {
        swap (v[1], v[n]);
        hip (1, n - 1);
    }

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

    printf ("\n");
    return 0;
}