STL 最大堆、最小堆的应用

1.priority_queue

priority_queue默认是最大堆,要用最小堆需要比较函数greater<int>

priority_queue<int, vector<int>, less<int>> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;

也可以自定义比较函数

struct cmp
{
     bool operator()(const int &a, const int &b)
    {
         return a > b;
    }
};
priority_queue<int, vector<int>, cmp> minHeap;

如果不是内置类型,也可以

struct cmp
{
     bool operator()(const Node&a, const Node&b)
    {
         return a.val > b.val;
    }
};

2. STL 堆操作

头文件是#include <algorithm>
一般用到这四个:make_heap()、pop_heap()、push_heap()、sort_heap();
(1)make_heap()构造堆
void make_heap(first_pointer,end_pointer,compare_function);
默认比较函数是(<),即最大堆。
函数的作用是将[begin,end)内的元素处理成堆的结构

(2)push_heap()添加元素到堆
void push_heap(first_pointer,end_pointer,compare_function);
新添加一个元素在末尾,然后重新调整堆序。该算法必须是在一个已经满足堆序的条件下。
先在vector的末尾添加元素,再调用push_heap

(3)pop_heap()从堆中移出元素
void pop_heap(first_pointer,end_pointer,compare_function);
把堆顶元素取出来,放到了数组或者是vector的末尾。
要取走,则可以使用底部容器(vector)提供的pop_back()函数。
先调用pop_heap再从vector中pop_back元素

(4)sort_heap()对整个堆排序
排序之后的元素就不再是一个合法的堆了。

用法:

void testHeap() {
    vector<int> data{ 3,1,2,7,5 };
    //构造堆,最大堆
    make_heap(data.begin(), data.end(), less<int>());
    //pop堆顶元素,最大的元素
    pop_heap(data.begin(), data.end(), less<int>());
    cout << data.back() << endl;//输出7
    data.pop_back();
    //往堆中添加元素
    data.push_back(4);
    push_heap(data.begin(), data.end(), less<int>());//调整堆
    //排序
    sort_heap(data.begin(), data.end(), less<int>());
    for (int x : data)
        cout << x << " ";
    cout << endl;//输出 12345
}
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值