PAT 備考——優先佇列(堆)與堆排序
阿新 • • 發佈:2019-01-10
一、堆
堆是完全二叉樹型中的一種的資料結構,按照排列順序分為大頂堆和小頂堆。其中大頂堆表示二叉樹中所有根節點比子節點大,小頂堆反之。
因此,以大頂堆為例,堆具有如下兩個性質:
- 有序性:從根節點到任意子節點的路徑,所經過的節點是有序排列的;
- 完全性:與完全二叉樹相同,當用陣列來表示二叉堆時,下標為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的結果是相反的