STL的heap

C++提供的一些堆的操作。参考这篇文章写的:原文出处

#include<bits/stdc++.h>
using namespace std;
/*
    堆:
        stl中没有提供堆这个容器。
        但是提供了把线性容器变成堆的函数,堆的特点之一就是完全二叉树。
        本就应该使用线性容器存储。

    操作:
        1)创建堆:
            make_heap(first, end + 1, cmp);
            把区间[fisrt, end]中的数据调整成堆。cmp确定最大最小堆 
        2)弹出栈顶:
            pop_heap(first, end + 1, cmp);
            弹出区间[first, end + 1]的栈顶。cmp 
        3)插入后调整
            push_heap(first, end + 2, cmp);
            先把需要插入的数据放在索引为end + 1的位置,然后调用此函数调整 
        4)排序:
            sort_heap(first, end + 1, cmp);
            把堆按cmp规则排序,存储在原数组中 

*/

/*
    小于号最大堆、大于号最小堆 
*/
bool cmp(int a,int b) { return a > b; }
int main()
{
    int i, number[20] = {29, 23, 20, 22, 17, 15, 26, 51, 19, 12, 35, 40};
    make_heap(&number[0], &number[12]);
    for(i = 0;i < 12; i++)      //结果是:51 35 40 23 29 20 26 22 19 12 17 15
        printf("%d ", number[i]);
    printf("\n");

    make_heap(&number[0], &number[12], cmp);
    for(i = 0; i < 12; i++)     //结果:12 17 15 19 23 20 26 51 22 29 35 40
        printf("%d ", number[i]);
    printf("\n");

    number[12] = 8;  //加入元素8
    //加入后调整
    push_heap(&number[0], &number[13], cmp);
    for(i = 0; i < 13; i++)     //结果:8 17 12 19 23 15 26 51 22 35 40 20
        printf("%d ", number[i]);
    printf("\n");

    //弹出元素8
    pop_heap(&number[0], &number[13], cmp);
    for(i = 0; i < 13; i++) //结果:12 17 15 19 23 20 26 51 22 29 35 40
        printf("%d ", number[i]);
    printf("\n");

    sort_heap(&number[0], &number[12],cmp);
    for(i = 0; i < 12; i++) //结果:51 40 35 29 26 23 22 20 19 17 15 12 
        printf("%d ", number[i]);
    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值