Cod sursa(job #1233068)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 24 septembrie 2014 17:18:28
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <algorithm>

using namespace std;

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

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

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

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

    return;
}

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

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

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

        heapup (i);
    }

    for (int k = n; k > 1; --k)
    {
        swap (h[1], h[k]);
        heapdown (1, k - 1);
    }

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

    printf ("\n");

    return 0;
}