Cod sursa(job #1337931)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 9 februarie 2015 17:23:21
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX_HEAP 500005
#define inFile "algsort.in"
#define outFile "algsort.out"

class Heap {
private:
    int heap[MAX_HEAP];
    int n;
    inline int left_son(int k) { return k*2; };
    inline int right_son(int k) { return k*2+1; };
    inline int father(int k) { return k/2; };
    void down(int k);
    void up(int k);
public:
    Heap(const int *a, int n);
    void h_insert(int key);
    void h_remove(int k);
    int top();
    bool h_empty();
};

void Heap::down(int k) {
    int son;
    do {
        son = 0;
        if(left_son(k) <= n) {
            son = left_son(k);
            if(right_son(k) <= n && heap[right_son(k)] < heap[son])
                son = right_son(k);
            if(heap[son] >= heap[k])
                son = 0;
        }
        if(son) {
            swap(heap[k], heap[son]);
            k = son;
        }
    } while(son);
}

void Heap::up(int k) {
    int key = heap[k];
    while(k > 1 && heap[k] < heap[father(k)]) {
        heap[k] = heap[father(k)];
        k = father(k);
    }
    heap[k] = key;
}

Heap::Heap(const int *a, int len) {
    int i;
    n = len;
    for(i = 1; i <= n; i++)
        heap[i] = *(a+i);
    for(i = n/2; i; --i)
        down(i);
}

void Heap::h_remove(int k) {
    heap[k] = heap[n];
    --n;
    if(k > 1 && heap[k] < heap[father(k)])
        up(k);
    else
        down(k);
}

void Heap::h_insert(int key) {
    heap[++n] = key;
    up(n);
}

int Heap::top() {
    return heap[1];
}

bool Heap::h_empty() {
    return n == 0;
}

int a[MAX_HEAP];

int main() {
    freopen(inFile, "r", stdin);
    freopen(outFile, "w", stdout);
    
    int n, i;
    
    scanf("%d", &n);
    for(i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    
    Heap H(a, n);
    while(!H.h_empty()) {
        printf("%d ", H.top());
        H.h_remove(1);
    }
    printf("\n");
    
    return 0;
}