最大堆
class MaxHeap {
constructor(arr = []) {
this.container = [];
if (Array.isArray(arr)) {
arr.forEach(this.insert.bind(this));
}
}
compare(a, b) {
return a - b; // MaxHeap
}
insert(data) {
const { container } = this;
container.push(data);
// 自底向上交换
let index = container.length - 1;
while (index) {
let parent = Math.floor((index - 1) / 2);
if (compare(container[parent], container[index]) >= 0) {
break;
}
[container[parent], container[index]] = [container[index], container[parent]];
index = parent;
}
}
extract() {
const { container } = this;
[container[0], container[container.length - 1]] = [container[container.length - 1], container[0]];
const val = container.pop();
let index = 0;
let child = 1;
// 自顶向下交换
while (child < container.length) {
if (child + 1 < container.length && compare(container[child + 1], container[child]) > 0) {
child = child + 1;
}
if (compare(container[index], container[child]) >= 0) {
break;
}
[container[index], container[child]] = [container[child], container[index]];
index = child;
child = child * 2 + 1;
}
return val;
}
top() {
const { container } = this;
if (container.length) {
return container[0];
}
return null;
}
}
最后更新于