來自度孃的釋義,堆的含義大概是這樣的:c++
感性理解:算法
堆(英語:heap)是計算機科學中一類特殊的數據結構的統稱。堆一般是一個能夠被看作一棵樹的數組對象。堆老是知足下列性質:
堆中某個節點的值老是不大於或不小於其父節點的值; 堆老是一棵徹底二叉樹。將根節點最大的堆叫作最大堆或大根堆,根節點最小的堆叫作最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
理性理解:數組
堆的定義以下:n個元素的序列{k1,k2,ki,…,kn}當且僅當知足下關係時,稱之爲堆。(k i <= k 2i,k i <= k 2i+1)或者(k i >= k 2i,k i >= k 2i+1), (i = 1,2,3,4...n/2)
然而手寫堆實在太困難有點長了,在NOIp&&NOI賽場上時間有限,因此一個模板的重要性不言而喻;(好比我排序向來都是sort數據結構
會手寫堆的都是神犇!less
真的!函數
反正我寫不了2333oop
因此上帝爲可愛的c++黨準備了貼身的STL模板-->heap;spa
默認用法 (但這樣生成的是大根堆;若是須要構建小根堆,須要進行修改。.net
Eg:c++11
1 vector<int> v{6, 1, 2, 5, 3, 4}; 2 make_heap(v.begin(), v.end());
自建小根堆
Eg:自定義比較函數:(彷佛是這樣我並不太懂
1 vector<int> v{6, 1, 2, 5, 3, 4}; 2 make_heap(v.begin(), v.end(), greater<int>());
這裏使用了greater<int>()
來代替默認的less<int>()
來建立int類型的heap。
能夠按層次遍歷的順序把這個heap畫出來,能夠看到它跟默認狀況恰好相反,會是一個小頂堆。
push_heap 把指定區間的最後一個元素插入到堆中
2 push_heap(v.begin(), v.end());
注意:須要知足的是此時的v必須知足是一個在區間(v.begin(), v.end())內知足堆的性質;不能直接比較23333
因此我一直以爲即便手寫堆也可使用模板
畢竟我不會寫
這樣就比較簡單。
pop_heap 把指定區間的最後一個元素插入到堆中
好比這樣:
2 auto largest = v.back();
3 psln(largest);
4 v.pop_back();
依舊須要知足v是一個堆;
並且他會將除最大值之外的節點重排;而v.back( )便將其找到了;
因此刪除它只須要令v.back()=0就好了。
海星
pop_heap 把指定區間的最後一個元素插入到堆中
sort_heap(v.begin(), v.end()); printContainer(v, "after sort_heap: ");
堆排序;
沒了
c++11裏面的玄學東西高考完再說
如今不敢用
畢竟我是一個聯賽選手
引用資料:
【C++ STL應用與實現】72: 標準庫裏的堆--如何使用標準庫的heap算法 https://blog.csdn.net/elloop/article/details/53402209