堆的操作函式定義在標頭檔案 algorithm 中
以下的**中均省略了輸出的**
vectora;
for (int i = 0; i < a.size(); i++)
函式:make_heap()根據指定的迭代器區間以及乙個可選的比較函式,來建立乙個heap,預設建立大根堆
// 1
template< class randomit >
void make_heap( randomit first, randomit last );
// 2
template< class randomit, class compare >
void make_heap( randomit first, randomit last, compare comp );
vectora;
make_heap(a.begin(), a.end());
輸出堆a:
指定比較函式建立大根堆:
指定比較函式建立小根堆:
函式:push_heap()把指定區間的最後乙個元素插入到heap中
注:在使用之前要想vector末尾中插入元素
// 1
template< class randomit >
void push_heap( randomit first, randomit last );
// 2
template< class randomit, class compare >
void push_heap( randomit first, randomit last, compare comp );
先用make_heap來構造乙個堆,然後在容器末尾追加元素之後,把新的迭代器區間傳給push_heap,這樣新尾部元素也被新增到堆中。
vectora;
make_heap(a.begin(), a.end(),less());
a.push_back(100);
push_heap(a.begin(), a.end());
結果:
預設使用的是大根堆的比較方式
注意:使用push_heap(f, l)的話,呼叫者需要確保(f, l-1)已經是乙個堆. push_heap(f, l)僅僅會把*(l)插入到(f, l-1)這個區間形成的堆中
若使用的是不同的比較函式:
100在插入堆使用的是小根堆的比較方式,而他的父節點4比100小,且4-3-100所形成的堆中已經是小根堆,所以就不進行替換。
函式:pop_heap()彈出heap頂元素, 將其放置於區間末尾
// 1
template< class randomit >
void pop_heap( randomit first, randomit last );
// 2
template< class randomit, class compare >
void pop_heap( randomit first, randomit last, compare comp );
它的作用是:交換first和*(last-1), 然後把(first, last-1)建成乙個max(min) heap. 也就是說把堆頂的最大元素交換到區間尾,然後把除了尾部的元素的剩餘區間重新調整成堆。
注意的是,呼叫者要保證,在呼叫pop_heap時(first, last)已經是乙個堆(使用相同的排序準則)。
函式:sort_heap()堆排序演算法,通常通過反覆呼叫pop_heap來實現
是經典的堆排序演算法,通過每次彈出堆頂直到堆為空,依次被彈出的元素就組成了有序的序列了
使用sort_heap(f, l)處理過的區間因為已經有序,就不再是乙個最大堆或者是最小堆了。
函式:is_heap()判斷給定區間是否是乙個最大堆或者最小堆//是返回1,不是返回0
//1 (since c++11)
template< class randomit >
bool is_heap( randomit first, randomit last );
//2 (since c++11)
template< class randomit, class compare >
bool is_heap( randomit first, randomit last, compare comp );
vectora;
bool flag = is_heap(a.begin(), a.end());
cout << "before heap a:";
if (flag)
cout << "此時堆是乙個最大堆或者最小堆" << endl;
else cout << "此時堆不是乙個最大堆或者最小堆" << endl;
make_heap(a.begin(), a.end(),less());
flag = is_heap(a.begin(), a.end());
cout << "after heap a:";
if (flag)
cout << "此時堆是乙個最大堆或者最小堆" << endl;
else cout << "此時堆不是乙個最大堆或者最小堆" << endl;
函式:is_heap_until()
//1 (since c++11)
template< class randomit >
randomit is_heap_until( randomit first, randomit last );
//2 (since c++11)
template< class randomit, class compare >
randomit is_heap_until( randomit first, randomit last, compare comp );
vectora;
auto iter = is_heap_until(a.begin(), a.end());
cout << "iter:" << *iter << endl;
我們可以自己分析得到在3的位置就不滿足小根堆的規律,在3之前的元素滿足小根堆的規律,所以iter應該是5
Python 堆(heap)的基本操作
python 堆 heap 的基本操作 import heapq 載入heap庫,heap指的是最小堆使陣列轉化為堆 heapq.heapify list heap 1,3,4,2,6,8,9 heapq.heapify heap heap 1,2,4,3,6,8,9 為heap增加元素 heap ...
堆(Heap)的實現
這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖 堆的本質就是乙個陣列 上圖中,紅色的是值,黑色的是下標 簡單的來說就是把乙個陣列看成是二叉樹,就像上圖 大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet child...
堆 Heap 的實現
什麼是堆?優先佇列 opriority queue 特殊的 佇列 取出元素的順序是依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆有兩大特性 1,結構性 是一顆完全二叉樹。2,有序性 每個葉子結點到根結點都是有序的,如果是公升序,那麼就是最大堆,否則為最小堆。這些是堆 下面的不是堆 ...