Data Structure - HEAP
1 minute read
#include <iostream>
using namespace std;
#define SWAP(a, b) { int temp = a; a = b; b = temp; }
struct heap {
int tree[40001];
int idx;
void init() {
idx = 0;
}
int size() {
return idx;
}
bool empty() {
return !idx;
}
int top() {
return tree[1];
}
// Push & Pop
void push(const int data) {
tree[++idx] = data;
for (int i = idx; i > 0; i /= 2) {
if (i / 2 != 0 && tree[i / 2] < tree[i]) {
swap(tree[i / 2], tree[i]);
}
}
}
void pop() {
if (empty()) {
return;
}
tree[1] = tree[idx--];
for (int i = 1; i * 2 <= idx;) {
int k = i * 2 + 1;
if (i * 2 == idx || tree[i * 2 + 1] < tree[i * 2]) {
k = i * 2;
}
if (tree[i] < tree[k]) {
swap(tree[i], tree[k]);
i = k;
} else {
break;
}
}
}
void print() {
for (int i = 1; i <= idx; ++i) {
cout << tree[i] << " ";
}
cout << '\n';
}
// Sort
void heapify(int i, int n) {
int largest = i;
int left = i * 2;
int right = i * 2 + 1;
if (left < n && tree[left] > tree[largest]) {
largest = left;
}
if (right < n && tree[right] > tree[largest]) {
largest = right;
}
if (largest != i) {
SWAP(tree[i], tree[largest]);
heapify(largest, n);
}
}
void buildHeap(int n) {
for (int i = n / 2; i > 0; --i) {
heapify(i, n);
}
}
void heapSort(int n) {
buildHeap(n);
for (int i = n - 1; i > 0; --i) {
SWAP(tree[i], tree[1]);
heapify(i, n);
}
}
};
int main() {
heap h;
h.init();
h.push(100);
h.push(59);
h.push(3000);
h.push(500);
h.push(1);
h.print();
h.heapSort(h.size());
h.print();
h.pop();
h.pop();
h.pop();
h.print();
return 0;
}