#include<iostream>
#include<cstdio>
#define e -1
#define initiate 100
#define increase 10
using namespace std;
class heap {
private:
int *m_heap;
int i;
int maxsize;
public:
heap();
heap(int size);
void push(int p);
int top();
void pop();
int size();
};
int heap::size() {
return i;
}
heap::heap() {
m_heap = (int*)malloc(sizeof(int)*initiate);
m_heap[0] = e;
maxsize = initiate;
i = 0;
}
heap::heap(int size) {
m_heap = (int*)malloc(sizeof(int)*size);
m_heap[0] = e;
maxsize = size;
i = 0;
}
void heap::push(int p) {
if (i >= maxsize) {
int *temp = (int*)realloc(m_heap, sizeof(int)*(maxsize + increase));
maxsize += increase;
m_heap = temp;
}int j;
for (j = ++i; m_heap[j / 2] > p; j /= 2)
m_heap[j] = m_heap[j/ 2];
m_heap[j] = p;
return;
}
int heap::top() {
return m_heap[1];
}
void heap::pop() {
if (i < 1) { cout << "heap is empty!" << endl; return; }
if (i == 1) { i--; return; }
int j , child = 0;
int lastelement = m_heap[i--];
for (j = 1; j * 2 <=i; j = child) {
child = j * 2;
if (child<i&&m_heap[child]>m_heap[child+1])
child++;
if (m_heap[child] < lastelement)
m_heap[j] = m_heap[child];
else
break;
}
m_heap[j] = lastelement;
return;
}
int main() {
heap q(10);
int n[10] = { 8,10, 15, 12, 3, 4, 13, 1, 15,56 };
for (int i = 0; i < 10; i++) {
q.push(n[i]);
}
while (q.size() > 0) {
cout << q.top() << endl;
q.pop();
}
return 0;
}