STL中的堆heap

在STL中堆heap的算法都包含在#include<algorithm>头文件中,主要包含以下函数:

  • make_heap()生成堆,默认less(生成大顶堆)

make_heap(_RAIter,_RAIter)默认生成大顶
make_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(生成小顶堆),一种是less(生成大顶堆)

堆操作:增加元素(push_heap),删除元素(pop_heap), 排序(sort_heap), 均要求区间已经是一个heap,并且是与当前操作使用相同的排序准则

  • push_heap()是向堆中插入一个元素,使堆的规制依然成立

push_heap(_RAIter,_RAIter) 默认为大顶堆
push_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
调用push_heap之前必须调用make_heap创建一个堆
首先数组push_back插入元素,然后再调用push_heap,它会使最后一个元素插到合适位置
注意,push_heap中的_Compare和make_heap中的_Compare参数必须是一致的,不然会插入堆失败,最后一个元素还是在最后位置,导致插入失败

  • pop_heap在堆的基础上弹出堆顶元素

pop_heap(_RAIter,_RAIter)默认为大顶堆
pop_heap(_RAIter,_RAIter,_Compare)_Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
比如pop_heap(nums.begin(), nums.end(),greater<int>()),它会将堆顶元素(即为数组第一个位置)和数组最后一个位置对调,然后你可以调用数组pop_back,删除这个元素
注意,pop_heap中的_Compare和make_heap中的_Compare参数必须是一致的,不然会失败

  • sort_heap堆排序算法

// 1
template< class RandomIt >
void sort_heap( RandomIt first, RandomIt last );
// 2
template< class RandomIt, class Compare
void sort_heap( RandomIt first, RandomIt last, Compare comp );

注意:

  1. 使用sort_heap(f, l)处理过的区间因为已经有序,就不再是一个heap了
  2. sort_heap(f, l)的cmp参数必须与make_heap(f,l)的cmp参数一致,否则堆排序失败。

C++11加入两个新成员is_heapis_heap_until略作了解。

  • 示例代码
# include <iostream>
# include <vector>
# include <algorithm>

using namespace std;

void printVec(vector<int> nums)
{
    for (int i = 0; i < nums.size(); ++i)
        cout << nums[i] << " ";
    cout << endl;
}
int main(void)
{
    int nums_temp[] = {8, 3, 4, 8, 9, 2, 3, 4, 10};
    vector<int> nums(nums_temp, nums_temp + 9);
    cout << "make_heap之前: ";
    printVec(nums);

    cout << "(默认(less))make_heap: ";
    make_heap(nums.begin(), nums.end());
    printVec(nums);

    cout << "(less)make_heap: ";
    make_heap(nums.begin(), nums.end(), less<int> ());
    printVec(nums);

    cout << "(greater)make_heap: ";
    make_heap(nums.begin(), nums.end(), greater<int> ());
    printVec(nums);

    cout << "此时,nums为小顶堆 greater" << endl;
    cout << "push_back(3)" << endl;
    nums.push_back(3);
    cout << "默认(less)push_heap 此时push_heap失败: ";
    push_heap(nums.begin(), nums.end());
    printVec(nums);
    cout << "push_heap为greater 和make_heap一致,此时push_heap成功: ";
    push_heap(nums.begin(), nums.end(), greater<int>());
    printVec(nums);
    cout << "(greater,不然会失败)pop_heap: ";
    pop_heap(nums.begin(), nums.end(),greater<int>());
    printVec(nums);
    cout << "pop_back(): ";
    nums.pop_back();
    printVec(nums);
    sort_heap(nums.begin(),nums.end(),greater<int>());
    cout<<"堆排序结果:";
    printVec(nums);
}
  • 运行结果
make_heap之前: 8 3 4 8 9 2 3 4 10
(默认(less))make_heap: 10 9 4 8 8 2 3 4 3
(less)make_heap: 10 9 4 8 8 2 3 4 3
(greater)make_heap: 2 3 3 4 8 4 10 9 8
此时,nums为小顶堆 greater
push_back(3)
默认(less)push_heap 此时push_heap失败: 2 3 3 4 8 4 10 9 8 3
push_heap为greater 和make_heap一致,此时push_heap成功: 2 3 3 4 3 4 10 9 8 8
(greater,不然会失败)pop_heap: 3 3 4 4 3 8 10 9 8 2
pop_back(): 3 3 4 4 3 8 10 9 8
堆排序结果:10 9 8 8 4 4 3 3 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值