1. 程式人生 > 其它 >C++堆與優先佇列

C++堆與優先佇列

技術標籤:C/C++

文章目錄

一. 堆的有關概念

堆首先是一種完全二叉樹。分為大頂堆和小頂堆
大頂堆:
在這裡插入圖片描述
小頂堆:
在這裡插入圖片描述
由於堆是完全二叉樹,因此也可以用陣列表示與儲存,比二叉樹結點儲存法節省空間。儲存方式即為層序遍歷,如上圖中的小頂堆,儲存為[2,7,4,10,8,6]

陣列索引012345
2741086

二.優先佇列(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;
}

結果

在這裡插入圖片描述
注意這裡不是按大小排序,而是層序遍歷