【数据结构】堆,大根堆,小根堆,优先队列 详解

本文详细介绍了堆数据结构,包括堆的数组实现、小根堆和大根堆的概念。小根堆中父节点的值小于或等于子节点,大根堆则相反。堆常用于实现优先队列,标准库通过元素的<操作符确定优先级。文中还展示了如何自定义比较函数以及通过自定义结构实现优先级,并给出了两个涉及优先队列的例题。
摘要由CSDN通过智能技术生成

要了解堆之前,请先了解树,因为堆是一颗完全二叉树

如果不知道的话请点击下方链接了解

树,二叉树,完全二叉树详解

要注意的是

  • 首先堆是一颗完全二叉树

  • 其次堆中存储的值是偏序

Min-heap(小根堆): 父节点的值小于或等于子节点的值

Max-heap(大根堆): 父节点的值大于或等于子节点的值
在这里插入图片描述
好吧其实就是实现自动排序

O(logn)时间复杂度内实现插入,删除,O(1)查询

1.堆的数组实现

如果用数组来存储,那么儿子的编号便满足如下的性质

  • 左儿子的编号是自己的编号的x2+1

  • 右儿子的编号是自己的编号的x2+2

在这里插入图片描述
代码如下:

int heap[N],sz=0;
void push(int x)
{
   
    int i=sz++;
    while(i>0)//往上走
    {
   
        //父结点的编号
        int p=(i-1)/2;
        //如果不需要再交换就break;
        if(heap[p]<=x)break;
        heap[i]=head[p];
        i=p;
    }
    heap[i]=x;
}
//删除最小值:先把最小值丢掉,先把最后一个节点的值放到根节点处,然后排序交换即可
int pop()
{
   
    //最小值
    int ret=heap[0];
    int x=heap[--sz];
    int i=0;
    while(i*2+1<sz)//因为堆是完全二叉树偏左嘛
    {
   
        //左右儿子
        int a=i*2+1,b=i*2+2;
        //选出儿子中最小的
        if(b<sz&&heap[b]<heap[a])a=b;
        //如果不需要交换就break
        if(heap[a]>=x)break;
        //交换
        heap[i]=heap[a];
        i=a;
    }
    heap[i]=x;
    return ret;//返回被丢掉的那个最小值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁凡さん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值