PAT 备考——优先队列(堆)与堆排序

版权声明:Dirichlet_zju https://blog.csdn.net/Dirichlet_zju/article/details/84710806

一、堆

堆是完全二叉树型中的一种的数据结构,按照排列顺序分为大顶堆和小顶堆。其中大顶堆表示二叉树中所有根节点比子节点大,小顶堆反之。

因此,以大顶堆为例,堆具有如下两个性质:

  • 有序性:从根节点到任意子节点的路径,所经过的节点是有序排列的;
  • 完全性:与完全二叉树相同,当用数组来表示二叉堆时,下标为k的根节点的左子节点下标是2k,右子节点是2k+1。

二、STL中的priority_queue

priority_queue又称为优先队列,使用前#include<queue>。

基本用法:

1.定义

priority_queue<int> q;

priority_queue<int, vector<int>, less<int> > q;//注意空格

vector表示底层堆数据结构的集成容器是vector,less表示数字越大优先级越大(大顶堆),greater表示小顶堆

2.函数

q.push(5);推入元素

int p = q.top(); 返回顶点

q.pop();

q.empty();

q.size();

3.结构体优先级设置

例如priority_queue<struct1> q   这样的优先队列要怎么来设置优先级呢?

struct struct1{
    int a, b;
    friend bool operator < (struct1 s1, struct2 s2){
        return s1.a>s2.a;
    }
};

需要注意两点:

1.operator后面的<符号表示重载小于号,如果重载大于号会出错;

2.堆顶元素依然与你所赋予的大于小于相反,也就是和sort的自定义函数cmp的结果是相反的 

猜你喜欢

转载自blog.csdn.net/Dirichlet_zju/article/details/84710806