0

界面看起来像这样

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;
}
4

0 回答 0