Cod sursa(job #820821)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 21 noiembrie 2012 11:05:37
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <cassert>
using namespace std;

ifstream in("algsort.in");
ofstream out("algsort.out");

int h[100010],n,i,j,k;

inline void heap_add(int v) {
    h[++h[0]] = v;
    
    // urca in heap
    int i = h[0], t;
    while(i > 1 && h[i] < h[i/2]) {
        t = h[i];
        h[i] = h[i/2];
        h[i/2] = t;
        i /= 2;
    }
}

inline int min3(int a, int b, int c) {
    return min(a, min(b, c));
}

inline int heap_pop() {
    int v = h[1];
    h[1] = h[h[0]];
    h[0] --;

    int i = 1;
    
    i = 1;
    // coboara in heap
    while(2*i <= h[0]) {
        if(2*i+1 > h[0]) {
            if(h[i] > h[2*i])
                swap(h[i], h[2*i]);
            break;
        } else {
            if(h[i] == min3(h[i], h[2*i], h[2*i+1]))
                break;
            else if(h[2*i] > h[2*i+1]) {
                swap(h[i], h[2*i+1]);
                i = 2*i+1;
            } else {
                swap(h[i], h[2*i]);
                i = 2*i;
            }
        }
    }
    return v;
}

inline bool heap_check(int i) {
    if(2 * i > h[0]) {
        return true;
    }
    if(h[i] > h[2*i]) {
        return false;
    }
    if(2*i+1 <= h[0] && h[i] > h[2*i+1]) {
        return false;
    }

    if(2*i+1 <= h[0]) {
        return heap_check(2*i) && heap_check(2*i+1);
    } else {
        return heap_check(2*i);
    }
}

int main() {
    in>>n;
    for(i=1; i<=n; i++) {
        in>>k;
        heap_add(k);
    }
    for(i=1; i<=n; i++) {
        out<<heap_pop()<<' ';
        //heap_pop();
        //for(j=1; j<=h[0]; j++) {
        //    out<<h[j]<<'\t';
        //}
        //out<<'\n';
   }
}