界面看起来像这样
template <class T, class Pred>
void downheap (std::vector<T>& heap_vector, unsigned int startingIndex, Pred predicateFunc);
如果起始索引在向量中的k 处,则其在堆中的左子节点将位于索引(2 * k)处 ,其在堆中的右子节点将位于索引((2 * k )+ 1)处。本质上,该项目应与堆中的适当子项进行比较(并根据需要进行交换),直到满足谓词函数的给定顺序为止。
谓词可能大于、小于或任何自定义序列...
在实现这种方法时,如何检查索引访问是否在大小限制内?即 heap_vector[rightChildIndex]或heap_vector[leftChildIndex]在循环和进行比较时不应超出heap_vector.size()-1 ......这让我有点头疼
这是我的代码
while ( pred ( heap_vector[rightChild], heap_vector[parentIndex] ) || pred (
heap_vector[leftChild], heap_vector[parentIndex] ) ) {
if ( pred ( heap_vector[rightChild], heap_vector[leftChild]) ) {
std::swap(heap_vector[parentIndex],heap_vector[rightChild]);
parentIndex=rightChild;
}
else {
std::swap( heap_vector[parentIndex], heap_vector[leftChild]);
parentIndex=leftChild;
}
rightChild= 2*parentIndex+1;
leftChild=2*parentIndex;
if (rightChild>heap_vector.size() || leftChild>heap_vector.size())
break;
}