#include<bits/stdc++.h>
using namespace std;
class MinHeap {
public:
int *arr;
int size{0};
int capacity{1000};
MinHeap() {
arr = new int[capacity];
size = 0;
}
~MinHeap() {
delete[] arr;
arr = nullptr;
size = 0;
}
int leftchild(int node) {
int ans = 2 * node + 1;
return ans >= size ? -1 : ans;
}
int rightchild(int node) {
int ans = 2 * node + 2;
return ans >= size ? -1 : ans;
}
int parent(int node) {
return node == 0 ? -1 : (node - 1) / 2;
}
void heapifyUp(int child_pos) {
int parent_pos = parent(child_pos);
if (child_pos == 0 || parent_pos == -1 || arr[parent_pos] < arr[child_pos]) {
return;
}
swap(arr[parent_pos], arr[child_pos]);
heapifyUp(parent_pos);
}
void push(int node) {
assert(!isFull());
arr[size++] = node;
heapifyUp(size - 1);
}
void heapifyDown(int parent_pos) {
int left_child = leftchild(parent_pos);
int right_child = rightchild(parent_pos);
int min_child = parent_pos;
if (left_child != -1 && arr[left_child] < arr[min_child]) {
min_child = left_child;
}
if (right_child != -1 && arr[right_child] < arr[min_child]) {
min_child = right_child;
}
if (min_child != parent_pos) {
swap(arr[parent_pos], arr[min_child]);
heapifyDown(min_child);
}
}
void pop() {
assert(!isEmpty());
swap(arr[0], arr[--size]);
heapifyDown(0);
}
int top() {
assert(!isEmpty());
return arr[0];
}
bool isEmpty() {
return size == 0;
}
bool isFull() {
return size == capacity;
}
//Problem 5:
void heapSort(int *a, int size){
MinHeap heap;
for(int i = 0; i < size;i++){
heap.push(a[i]);
}
for(int i = 0; i <size; i++){
a[i] = heap.top();
heap.pop();
}
}
};
int main(){
MinHeap h;
int vec[]{1, 3, 5, 7, 9, 6, 8};
h.heapSort(vec,7);
cout << "The heap sort is : \n";
for(auto value : vec){
cout << value << " ";
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE1pbkhlYXAgewpwdWJsaWM6CiAgICBpbnQgKmFycjsKICAgIGludCBzaXplezB9OwogICAgaW50IGNhcGFjaXR5ezEwMDB9OwoKICAgIE1pbkhlYXAoKSB7CiAgICAgICAgYXJyID0gbmV3IGludFtjYXBhY2l0eV07CiAgICAgICAgc2l6ZSA9IDA7CiAgICB9CgogICAgfk1pbkhlYXAoKSB7CiAgICAgICAgZGVsZXRlW10gYXJyOwogICAgICAgIGFyciA9IG51bGxwdHI7CiAgICAgICAgc2l6ZSA9IDA7CiAgICB9CgogICAgaW50IGxlZnRjaGlsZChpbnQgbm9kZSkgewogICAgICAgIGludCBhbnMgPSAyICogbm9kZSArIDE7CiAgICAgICAgcmV0dXJuIGFucyA+PSBzaXplID8gLTEgOiBhbnM7CiAgICB9CgogICAgaW50IHJpZ2h0Y2hpbGQoaW50IG5vZGUpIHsKICAgICAgICBpbnQgYW5zID0gMiAqIG5vZGUgKyAyOwogICAgICAgIHJldHVybiBhbnMgPj0gc2l6ZSA/IC0xIDogYW5zOwogICAgfQoKICAgIGludCBwYXJlbnQoaW50IG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSA9PSAwID8gLTEgOiAobm9kZSAtIDEpIC8gMjsKICAgIH0KCiAgICB2b2lkIGhlYXBpZnlVcChpbnQgY2hpbGRfcG9zKSB7CiAgICAgICAgaW50IHBhcmVudF9wb3MgPSBwYXJlbnQoY2hpbGRfcG9zKTsKICAgICAgICBpZiAoY2hpbGRfcG9zID09IDAgfHwgcGFyZW50X3BvcyA9PSAtMSB8fCBhcnJbcGFyZW50X3Bvc10gPCBhcnJbY2hpbGRfcG9zXSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN3YXAoYXJyW3BhcmVudF9wb3NdLCBhcnJbY2hpbGRfcG9zXSk7CiAgICAgICAgaGVhcGlmeVVwKHBhcmVudF9wb3MpOwogICAgfQoKICAgIHZvaWQgcHVzaChpbnQgbm9kZSkgewogICAgICAgIGFzc2VydCghaXNGdWxsKCkpOwogICAgICAgIGFycltzaXplKytdID0gbm9kZTsKICAgICAgICBoZWFwaWZ5VXAoc2l6ZSAtIDEpOwogICAgfQoKICAgIHZvaWQgaGVhcGlmeURvd24oaW50IHBhcmVudF9wb3MpIHsKICAgICAgICBpbnQgbGVmdF9jaGlsZCA9IGxlZnRjaGlsZChwYXJlbnRfcG9zKTsKICAgICAgICBpbnQgcmlnaHRfY2hpbGQgPSByaWdodGNoaWxkKHBhcmVudF9wb3MpOwogICAgICAgIGludCBtaW5fY2hpbGQgPSBwYXJlbnRfcG9zOwoKICAgICAgICBpZiAobGVmdF9jaGlsZCAhPSAtMSAmJiBhcnJbbGVmdF9jaGlsZF0gPCBhcnJbbWluX2NoaWxkXSkgewogICAgICAgICAgICBtaW5fY2hpbGQgPSBsZWZ0X2NoaWxkOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJpZ2h0X2NoaWxkICE9IC0xICYmIGFycltyaWdodF9jaGlsZF0gPCBhcnJbbWluX2NoaWxkXSkgewogICAgICAgICAgICBtaW5fY2hpbGQgPSByaWdodF9jaGlsZDsKICAgICAgICB9CgogICAgICAgIGlmIChtaW5fY2hpbGQgIT0gcGFyZW50X3BvcykgewogICAgICAgICAgICBzd2FwKGFycltwYXJlbnRfcG9zXSwgYXJyW21pbl9jaGlsZF0pOwogICAgICAgICAgICBoZWFwaWZ5RG93bihtaW5fY2hpbGQpOwogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIHBvcCgpIHsKICAgICAgICBhc3NlcnQoIWlzRW1wdHkoKSk7CiAgICAgICAgc3dhcChhcnJbMF0sIGFyclstLXNpemVdKTsKICAgICAgICBoZWFwaWZ5RG93bigwKTsKICAgIH0KCiAgICBpbnQgdG9wKCkgewogICAgICAgIGFzc2VydCghaXNFbXB0eSgpKTsKICAgICAgICByZXR1cm4gYXJyWzBdOwogICAgfQoKICAgIGJvb2wgaXNFbXB0eSgpIHsKICAgICAgICByZXR1cm4gc2l6ZSA9PSAwOwogICAgfQoKICAgIGJvb2wgaXNGdWxsKCkgewogICAgICAgIHJldHVybiBzaXplID09IGNhcGFjaXR5OwogICAgfQogICAKICAgIC8vUHJvYmxlbSA1OgogICAgdm9pZCBoZWFwU29ydChpbnQgKmEsIGludCBzaXplKXsKICAgICAgICBNaW5IZWFwIGhlYXA7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7aSsrKXsKICAgICAgICAgICAgaGVhcC5wdXNoKGFbaV0pOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDxzaXplOyBpKyspewogICAgICAgICAgICBhW2ldID0gaGVhcC50b3AoKTsKICAgICAgICAgICAgaGVhcC5wb3AoKTsKICAgICAgICB9CiAgICB9Cn07CmludCBtYWluKCl7CiAgICBNaW5IZWFwIGg7IAogICAgaW50IHZlY1tdezEsIDMsIDUsIDcsIDksIDYsIDh9OwogICAgaC5oZWFwU29ydCh2ZWMsNyk7CiAgICBjb3V0IDw8ICJUaGUgaGVhcCBzb3J0IGlzIDogXG4iOwogICAgZm9yKGF1dG8gdmFsdWUgOiB2ZWMpewogICAgICAgIGNvdXQgPDwgdmFsdWUgPDwgIiAiOwogICAgfQogICAgcmV0dXJuIDA7Cn0=