Cod sursa(job #1490020)

Utilizator GabiADAndrei Gabriel GabiAD Data 22 septembrie 2015 17:20:24
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
/*#include <stdio.h>
#include <stdlib.h>
*/

#include <iostream>
using namespace std;
int a[100000], n, m;

void siftUp(int index)
{
    int tata = (index-1)/2, aux;

    if(a[index] < a[tata])
    {
        aux = a[index];
        a[index] = a[tata];
        a[tata] = aux;

        siftUp(tata);
    }
}

void siftDown(int index)
{
    int fiu1 = 2*index + 1;
    int fiu2 = 2*index + 2, aux;

    if(fiu1 >= n)
        return;
    else if(fiu2 >= n && (a[index] > a[fiu1]))
    {
        aux = a[index];
        a[index] = a[fiu1];
        a[fiu1] = aux;
    }
    else if((a[index] > a[fiu1]) && (a[fiu1] < a[fiu2]))
    {
        aux = a[index];
        a[index] = a[fiu1];
        a[fiu1] = aux;

        siftDown(fiu1);
    }
    else if((a[index] > a[fiu2]) && (a[fiu2] < a[fiu1]))
    {
        aux = a[index];
        a[index] = a[fiu2];
        a[fiu2] = aux;

        siftDown(fiu2);
    }

}

void push(int x)
{
    n++;
    a[n-1] = x;

    siftUp(n-1);
}

int pop()
{
    int au = a[0];
    a[0] = a[--n];
    siftDown(0);

    return au;
}


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

    int i, x;
    //scanf("%d\n", &m);
    cin >> m;

    for(i = 0; i < m; i++)
    {
        //scanf("%d", &x);
        cin >> x;
        push(x);
    }

    for(i = 0; i < m; i++)
        //printf("%d ", pop());
        cout << pop() << " ";


    return 0;
}