Cod sursa(job #1461405)

Utilizator CollermanAndrei Amariei Collerman Data 15 iulie 2015 17:03:18
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
using namespace std;
ofstream fout("algsort.out");
ifstream fin("algsort.in");
const int NMAX = 500005;

int n, v[NMAX];

inline int father(int nod)     { return nod / 2; }
inline int left_son(int nod)   { return nod * 2; }
inline int right_son(int nod)  { return nod * 2 + 1; }
inline void afis()             { for(int i=1; i<=n; i++) fout << v[i] << ' '; }
inline void citire()           { fin >> n; for(int i=1; i<=n; i++) fin >> v[i]; }

void go_down(int nod, int lg)
{
    int son = 1;

    while(son) {
        son = 0;
        if(left_son(nod) <= lg) {
            son = left_son(nod);
            if(right_son(nod) <= lg && v[right_son(nod)] > v[son])
                son = right_son(nod);
            if(v[son] < v[nod])
                son = 0;
        }

        if(son) {
            swap(v[son], v[nod]);
            nod = son;
        }
    }
}

void build_heap() { for(int i=n/2; i; i--) go_down(i, n); }

void heapsort()
{
    build_heap();
    for(int i=n; i>=2; i--) {
        swap(v[i], v[1]);
        go_down(1, i-1);
    }
}

int main()
{
    citire();
    heapsort();
    afis();
    return 0;
}