在c ++中实现max和min堆

时间:2014-10-13 14:55:28

标签: c++

因此,为了制作最大堆,我可以执行以下操作:

int main () {
  int myints[] = {10,20,30,5,15};
  std::vector<int> v(myints,myints+5);

  std::make_heap (v.begin(),v.end());
  std::cout << "initial max heap   : " << v.front() << '\n';

我怀疑。就像我使用push_back操作插入向量一样,有没有什么方法可以像这样插入最大堆?或者它总是通过矢量?

其次,这是为了制作最大堆。最小堆有类似的东西吗?谢谢!

1 个答案:

答案 0 :(得分:3)

将元素插入堆中需要两个步骤。首先,您需要在表示堆的容器后面插入一个元素。标准push_back会这样做。然后你需要使用push_heap,它基本上会在范围的最后一个元素上调用upheap。

对于不同的排序,您需要使用自定义版本的比较器。默认值是当第一个元素小于第二个元素时,它会返回true。所以你需要扭转逻辑。有几种方法可以做到这一点。我使用lambda显式operator>而不是operator<。可以使用一些更精美的模板,或者使用functional

完整代码示例:

#include <iostream>
#include <algorithm>

int main() {
    std::vector<int> v {10,20,30,5,15};
    std::make_heap(v.begin(), v.end());
    v.push_back(40);
    std::push_heap(v.begin(), v.end()); // notice that now the v.end() points 
                                        // to different location than before
    for (auto i : v) std::cout << i << ' ';
    std::cout << '\n';

    auto cmp = [](int a, int b) { return a>b; }; // custom comparator via lambda
    std::make_heap(v.begin(), v.end(), cmp); // make a new heap using `cmp`
    v.push_back(3);                          // add another element
    std::push_heap(v.begin(), v.end(), cmp); // restore heap structure using `cmp`
    for (auto i : v) std::cout << i << ' ';
    return 0;
}

为了functional更大的例子:

#include <iostream>
#include <algorithm>
#include <functional>

int main() {
    std::vector<int> v {10,20,30,5,15};
    auto cmp = std::greater<int>(); // make an instance of standard `greater` comparator
    std::make_heap(v.begin(), v.end(), cmp); // make a new heap using `cmp`
    v.push_back(3);                          // add another element
    std::push_heap(v.begin(), v.end(), cmp); // restore heap structure using `cmp`
    for (auto i : v) std::cout << i << ' ';
    return 0;
}