堆在我們做演算法時應該有映像吧,分為大根堆,小根堆。
stl中的其實是對堆有實現的,使得我們可以直接拿來用。
相關的函式是make_heap();push_heap();pop_heap();sort_heap();
make_heap
make_heap(first,end,cmp);引數有3個,第乙個為堆建立堆的第乙個元素,第二個為最後乙個元素的後面乙個位置,第三個為比較函式。
這個函式的第一和第二個引數的形式決定了建立堆必須是連續的記憶體分配形式,常見的就是vector和陣列,別的像dequeue不常用我就不說了。
有start和end指定的區間是[start,end),也就是不包括end。對於vector很容易理解,start就是vector.begin(), end就是vector.end();
第三個函式是比較大小的函式,如果空著,預設建立大根堆。否則需要傳入比較函式。
例子:#include #include #include using namespace std;
//上面的宣告在後面的例子中自動包含,不重複寫
bool mycmp(int a,int b)
int main()
//建大根堆
make_heap(demo.begin(),demo.end());
out << "big root:" <
輸出:big root:
19,18,14,17,10,12,13,16,8,9,1,11,5,2,6,15,7,3,0,4,
small root:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, //這個怎麼是線性有序的??因為這就是乙個滿足條件的小根堆,所以演算法沒有出問題的。
push_heap(start,end,cmp);
這個函式是建立在已經make_heap()的基礎上,插入乙個資料,使形成新堆,新插入的資料必須位於原有序的序列的最後,如果原來的是不成堆的,那麼其運算結果也是不能保證成堆的。因為內部實現是只進行乙個堆調整,把end之前的最後乙個數加入堆。
各引數的意義同make_heap().
pop_heap(start,end,cmp);
這個函式是和push_heap相反的功能,他是把成堆佇列的首個元素從隊中拎出來,放到end之前的最後乙個位置。其餘元素從新調整成堆。
例子:在前面make_heap()基礎上:
int main()兩次,不能全部push_back之後再push_heap.
//增加新元素
demo.push_back(3);
//加入堆
push_heap(demo.begin(),demo.end(),mycmp);
cout << "small root with new member:" <
輸出: small root with new member:
0,1,2,3,3,5,6,7,8,4,10,11,12,13,14,15,16,17,18,19,9,
0small root after pop a member:
1,3,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
sort_heap()
我們知道在已經有序的堆中調一次pop_heap可以得到乙個最值。如果不停呼叫pop_heap(每次的end引數要減掉1)直到全部彈出,那麼就得到乙個有序的佇列。
原始若是大根堆,得到公升序。原來若是小根堆,得到降序。
例子:int main()
//或者實現成成員函式
//bool operator< (const node& node) const
};bool operator < (const node& a,const node& b)
priority_queuenodes;
nodes.push(node(1));
nodes.push(node(3));
nodes.push(node(2));
while(!nodes.empty())
};struct nodecmp
};priority_queue,nodecmp> nodes2;
nodes2.push(node(1));
nodes2.push(node(3));
nodes2.push(node(2));
while(!nodes2.empty()){
cout << nodes2.top().x<
輸出:
STL之堆操作
首先來看完全二叉樹的定義 若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。而將一維陣列視為完全二叉樹書得到的即為堆。堆效率極高,像十分常用的 排序演算法 dijkstra 演算法 prim 演算法等都要用堆...
關於STL中堆的建立
最近總有新手要問堆怎麼寫,我是這麼想的 既然都學c 了,堆這種東西怎麼能手寫呢,太對不起stl了 當然能手寫的都是的大神了,這只是我懶得手打的理由 正好之前機房有位大神將他學習的堆教給了我 我就以他講的寫一篇blog來幫助其他人吧 這裡先介紹一下vector vector是乙個動態陣列 當你需要多少...
c 的STL中堆的運用
stl中的建立的隊預設是最大堆,要想用最小堆的話,必須要在push heap,pop heap,make heap等每乙個函式後面加第三個引數greater 括號不能省略 make heap first,last,comp 預設是建立最大堆的。對int型別,可以在第三個引數傳入greater 得到最...