· · 个人记录

1. 放在前面

这里会先讲手打模板,可以直接翻到最后(所以本篇博客不长)。

2. 什么是堆

优先队列是堆!
堆就是用来维护序列中最“大”的一个数据结构。注意这里的“大”指的是最怎么样的数据,而不是意义上的“最大”。例如最大、最小。

3. 堆的性质

4. 手写【模板】堆

先奉上例题:【模板】堆
题目要求维护查询、插入、删除三种操作。分别来写:

5. 时间复杂度

查询时间复杂度必定为 O(1)
插入和删除最坏情况下要爬一遍树,但因为堆是完全二叉树,所以时间复杂度为 O(\log n)

6. 堆排序

堆排序很简单:先将所有数字压入堆,再将所有数字踢出去并输出。
代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000001],w=0;
//此处为find,pop,push,popx,pushx,代码略
int main()
{
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            push(x);
        }
        for(int j=1;j<=n;j++)
        {
            cout<<find();
            pop();
        }
}

堆排序时间复杂度 O(n \log n)

7. STL【模板】堆

例题不变,我们用STL的话就是priority_queue
专门有一篇博客哦!link