1. 程式人生 > >PAT 備考——優先佇列(堆)與堆排序

PAT 備考——優先佇列(堆)與堆排序

一、堆

堆是完全二叉樹型中的一種的資料結構,按照排列順序分為大頂堆和小頂堆。其中大頂堆表示二叉樹中所有根節點比子節點大,小頂堆反之。

因此,以大頂堆為例,堆具有如下兩個性質:

  • 有序性:從根節點到任意子節點的路徑,所經過的節點是有序排列的;
  • 完全性:與完全二叉樹相同,當用陣列來表示二叉堆時,下標為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的結果是相反的