堆(优先队列)

基础

完全二叉树

 代码

namespace little_Pile
{
    //小根堆 (大根堆更改为大于号)
    const int N;
    int len;
    int heap[N];
    int hp[N];// hp[k]存储堆中下标是 k 的点是第几个插入的
    int ph[N];// ph[k]存储第 k 个插入的点在堆中的位置

    //k是下标
    void PH_Swap(int x, int y); //交换
    void Up(int k);//向上调整
    void Down(int k);//向下调整
    void Insert(int k, int x);    //插入, x是第几次插入
    void Pop(int k);//删除
    
    //交换
    void PH_Swap(int x, int y)
    {
        swap(ph[hp[x]],ph[hp[y]]);
        swap(hp[x], hp[y]);
        swap(heap[y], heap[x]);
    } 
    //向上调整
    void Up(int k)
    {
        while(k > 1 && heap[k] < heap[k / 2])     //根据需要更改
        {
            PH_Swap(k, k / 2);
            k /= 2;    
        }
    }
    //向下调整
    void Down(int k)
    {
        while(k + k <= len)
        {
            int t = k + k;
            if(t + 1 <= len && heap[t + 1] < heap[t]) ++t;    //根据需要更改
            if (heap[t] >= heap[k]) break;
            PH_Swap(t, k);
            k = t; 
        }
    }
    //插入
    void Insert(int x, int k)    //k是第几次插入
    {
        heap[++len] = x;
        ph[k] = len;
        hp[len] = k;
        Up(len);
    }
    //删除
    void Pop(int k)
    {
        if (k == len)
        {
            --len;    
            return;
        }
        PH_Swap(k, len);
        --len;
        Up(K);
        Down(k);
    }    
}

STL(priority_queue默认大根堆)

注意

只能删除堆顶元素,且无清空

使用

empty(), size(), top(), push(), pop();

小根堆定义 priority_queue, greeter> q;

复杂度

O(nlogn)

每次操作均是logn

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绝尘JC

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

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

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

打赏作者

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

抵扣说明:

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

余额充值