STL之heap堆

本文介绍了STL中的堆数据结构,详细讲解了堆的定义,包括大顶堆和小顶堆的概念。堆主要通过vector实现,大顶堆的最大值在根节点,小顶堆的最小值在根节点。此外,文章还阐述了堆的使用方法,并给出了具体的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.解释:

二叉堆是一种完全二叉树,即整棵二叉树中除了最底层的叶子节点之外,其余节点是填满的,而最底层的叶子节点由左到右也是填满的不能存在空隙。

堆主要包括两类:大顶堆和小顶堆。大顶堆指每个节点的键值(key)都大于或等于其叶子节点的键值,而小顶堆指每个节点键值都小于等于其节点的键值。STL中堆主要使用vector、实现的。大顶堆的最大值在根节点,故其总是位于底层的vector、的起头处;小顶堆的最小值在根节点,故其总是位于vector/array的起头处。

二.用法:

1.头文件

#include <algorithm>

2.操作

make_heap(_First, _Last)//默认建大根堆,其中_First, _Last为指针
make_heap(_First,_Last,greater<int>())//建小根堆
make_heap(_First,_Last,less<int>())//建大根堆
push_heap (_First, _Last)//要现在vector中添加数据,其实相当于重新排序成大根堆
push_heap (_First, _Last,greater<int >())//注意比较函数一定要与make_heap建堆时一致
push_heap (_First, _Last,less<int >())//在大根堆中加入元素
pop_heap(_First, _Last)//弹出堆顶元素,实际是放到容器的最后,配合vector.pop_back()使用
pop_heap(_First, _Last,greater<int >())//同样要注意大小堆的问题
pop_heap(_First, _Last,greater<int >())
sort_heap(_First, _Last,greater<int >()) //堆排序,小根堆只能降序
sort_heap(_First, _Last,less<int >())//大根堆只能升序

三.例子:

# include <iostream>
# include <functional>
# 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);
        cout << "小根堆sort_heap(): ";
        sort_heap(nums.begin(), nums.end(),greater<int>());
        printVec(nums);
       cout << "(less)make_heap: ";
        make_heap(nums.begin(), nums.end(), less<int> ());
        printVec(nums);
        cout << "大根堆sort_heap(): ";
        sort_heap(nums.begin(), nums.end(),less<int>());
        printVec(nums);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值