Cod sursa(job #1066029)

Utilizator andreeaghetuUNIBUC andreeaghetu andreeaghetu Data 23 decembrie 2013 22:41:33
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <cmath>
using namespace std;
ifstream in ("algsort.in");
ofstream out ("algsort.out");

void swap (int &a, int &b)
{
    int t=a;
    a=b;
    b=t;
}

int minim (int a, int b, int i)
{
    if (a>b)
        return 2*i+1;
    else
        return 2*i;
}
void up(int *v, int i)
{
    while (i!=1 && v[i]<v[i/2])
    {
        swap (v[i], v[i/2]);
        i=i/2;
    }
}

void down(int *v, int i, int N)
{
    if (2*i>N)
        return;
    else
    {
        if (2*i+1<=N)
        {
            int poz=minim(v[2*i], v[2*i+1], i);
            if (v[poz]>=v[i])
                return;
            else
            {
                swap (v[i], v[poz]);
                down (v, poz, N);
            }

        }
        else
        {
            if (v[2*i]>=v[i])
                return;
            else
            {
                swap (v[i], v[2*i]);
                return;
            }
        }
    }
}

void push (int v[500005], int poz, int val)
{
    v[poz]=val;
    up(v, poz);
}

void pop (int *v, int N)
{
    out<<v[1]<<" ";
    v[1]=v[N];
    down(v, 1, N);
}

int main()
{
    int N;
    in>>N;
    int x, v[500005];
    for (int i=1;i<=N;++i)
    {
        in>>x;
        push(v, i, x);
    }
    for (int i=0;i<N;++i)
        pop(v, N-i);

    return 0;
}