C++堆與優先佇列
阿新 • • 發佈:2021-02-05
技術標籤:C/C++
文章目錄
一. 堆的有關概念
堆首先是一種完全二叉樹。分為大頂堆和小頂堆
大頂堆:
小頂堆:
由於堆是完全二叉樹,因此也可以用陣列表示與儲存,比二叉樹結點儲存法節省空間。儲存方式即為層序遍歷,如上圖中的小頂堆,儲存為[2,7,4,10,8,6]
陣列索引 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
值 | 2 | 7 | 4 | 10 | 8 | 6 |
二.優先佇列(priority_queue)
優先佇列首先是佇列,是隻有“一端能進”“一端能出”的表,C++中的priority_queue也有push與pop方法。
它的最大特點是自動將輸入序列進行排序。
堆的線性儲存
所在包:
#include<queue>
大根堆宣告。與java.util.PriorityQueue
中相反,預設為大根堆
priority_queue<int> pq1
priority_queue<int, vector<int>, less<int>> pq2
小根堆宣告
priority_queue<int, vector<int>, greater<int>> pq3
例項
#include<queue>
#include<iostream>
using namespace std;
int main() {
int a[] = { 11,9,7,5,13,17,19 };
priority_queue<int> pq1(a, a + 7);
priority_queue<int, vector<int>, less<int>> pq2(a, a + 7);
priority_queue<int, vector<int>, greater<int>> pq3(a, a + 7);
cout << "pq1出隊順序:" << endl;
while (!pq1.empty()) {
cout << pq1.top() << ",";
pq1.pop();
}
cout << endl;
cout << "pq2出隊順序:" << endl;
while (!pq2.empty()) {
cout << pq2.top() << ",";
pq2.pop();
}
cout << endl;
cout << "pq3出隊順序:" << endl;
while (!pq3.empty()) {
cout << pq3.top() << ",";
pq3.pop();
}
cout << endl;
return 0;
}
輸出
更詳細的API介紹可以檢視這篇文章
三.make_heap造堆
引包
#include<algorithm>
使用函式make_heap可以將一個可迭代容器
轉化為一個堆。除此外還pop_heap、push_heap等函式處理堆,具體API介紹可以檢視這篇文章
例項
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
vector<int> vec = { 11,9,7,5,13,17,19 };
make_heap(vec.begin(), vec.end(), less<int>());
cout << "造堆後:" << endl;
/* for (int i = 0; i < vec.size(); i++)
cout << vec[i] << endl; */
/* for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
cout << *it << ","; // *可用於解指標,也可用於解迭代器,與&對應
} */
for (auto it = vec.begin(); it != vec.end(); it++) {
cout << *it << ","; // *可用於解指標,也可用於解迭代器,與&對應
}
return 0;
}
結果
注意這裡不是按大小排序,而是層序遍歷