Max Heap (Javascript)
class MaxHeap {
constructor(capacity) {
this.capacity = capacity;
this.size = 0;
this.arr = [];
}
add(val) {
if (this.size < this.capacity) {
this.arr[this.size++] = val;
this.trickleUp(this.size - 1);
}
}
trickleUp(i) {
const parent = Math.floor((i - 1) / 2);
if (parent >= 0 && this.arr[i] > this.arr[parent]) {
this.swap(i, parent);
this.trickleUp(parent);
}
}
delete() {
if (this.size) {
const ret = this.arr[0];
this.arr[0] = this.arr[this.size-- - 1];
this.trickleDown(0);
return ret;
}
}
trickleDown(i) {
const left = 2 * i + 1;
const right = 2 * i + 2;
let largest = i;
if (left < this.size && this.arr[left] > this.arr[largest]) {
largest = left;
}
if (right < this.size && this.arr[right] > this.arr[largest]) {
largest = right;
}
if (largest !== i) {
this.swap(i, largest);
this.trickleDown(largest);
}
}
swap(a, b) {
const temp = this.arr[a];
this.arr[a] = this.arr[b];
this.arr[b] = temp;
}
hasNext() {
return this.size > 0;
}
}
/** Test **/
const maxHeap = new MaxHeap(1000);
maxHeap.add(1);
maxHeap.add(90);
maxHeap.add(11);
maxHeap.add(5);
while (maxHeap.hasNext()) {
console.log(maxHeap.delete());
}
/*
Output:
90
11
5
1
*/
// Time complexity for each operation: O(log(n)).