嘿,我尝试在 javascript 中实现最小堆,但我对删除 min 的算法有疑问。我在内部使用一个数组来表示堆。当我向下渗透时,停止条件应该是什么?在我的代码中,我将其设置为 2 * k <= this.size,因此它可能会向下移动到最后一个元素,但感觉不“正确”,是否有更好的停止条件?提前致谢!
this.removeMin = function () {
//replace root with last element and percolate downwards
var min = this._heap[1],
k,
left,
right;
this._heap[1] = this._heap.pop();
this.size--;
k = 1;
while ( ( 2 * k ) <= this.size) {
left = 2 * k;
right = 2 * k + 1;
if (this._heap[k] > this._heap[left] && this._heap[k] > this._heap[right]) {
if (this._heap[left] <= this._heap[right]) {
swap(this._heap, k, left);
k = left;
} else {
swap(this._heap, k, right);
k = right;
}
} else if (this._heap[k] > this._heap[left]) {
swap(this._heap, k, left);
k = left;
} else {
swap(this._heap, k, right);
k = right;
}
}
return min;
};