一.heap算法
在STL中,priority_queue(優先權隊列)的底層機制是最大堆,所以有必要先來了解一下heap。heap採用徹底二叉樹的結構,固然不是真正的binary tree,由於對於徹底二叉樹,咱們一般用一個數組來表示。數組
如下幾個算法都是STL的泛型算法,包含在頭文件algorithm裏,priority_queue的push(),pop()都有直接調用它們。函數
1.push_heap算法spa
首先,將新元素插入到底層vector的end()處。爲了知足最大堆原理(每一個結點的值必須大於或等於其子結點的值),因而將新結點與其父親結點比較,若是其值大於父親結點,就交換父子結點,直到不須要交換或者它已經到達根結點爲止。blog
2.pop_heap算法排序
由於做爲最大堆,根結點即爲最大值。交換vector首尾(first和last)元素,並從新調整[first,last-1)部分,也就是將「新根結點」跟其較大子結點交換,並持續下放,知道葉子結點爲止。注意,pop_heap以後,最大元素只是被放在底部容器的最尾端,並無被取走。若要取走,可用vector的pop_back()函數。隊列
3.sort_heap算法源碼
持續對整個heap作pop_heap操做,每次將操做範圍從後向前縮減一個元素,因而咱們獲得一個遞增序列。顯然,排序後的heap不是一個合法的heap了。it
4.make_heap算法io
這個算法用來將數組轉化成一個heap。
二.priority_queue
顧名思義,priority_queue是一個擁有權值觀念的queue。因爲這是一個queue,因此只容許在底端加入元素,並從頂端取出元素,除此以外沒有其餘存取元素的途徑,因此priority_queue沒有迭代器,不提供遍歷功能。
注意,priority_queue缺省狀況下是以vector爲底部容器,並非deque,而queue是以deque爲底部容器。
三.堆排序
瞭解以上內容後,最重要的是咱們能夠本身寫出一個堆排序算法,而不是簡單的應用這些泛型算法。固然了,限於本人水平,確定與源碼有天壤之別,只是一個簡單的堆排序算法而已。
void AdjustDown(vector<int> &A,int index,int rindex) { int len=A.size(); int child=2*index+1; //左孩子下標 int temp=A[index]; while(child<=rindex) { if(child<rindex&&A[child]<A[child+1]) //若右孩子大於左孩子 child++; //child指向右孩子 if(temp>=A[child]) break; //父結點大於孩子結點,無需調整 A[(child-1)/2]=A[child]; //不然父結點放較大孩子 child=2*child+1; //child指向「空」結點左孩子 } A[(child-1)/2]=temp; //空結點放須要調整(index)的值 } void HeapSort(vector<int> &A) { int i; int len=A.size(); for(i=(len-2)/2;i>=0;i--) //make_heap AdjustDown(A,i,len-1); for(i=len-1;i>0;i--) { swap(A[0],A[i]); AdjustDown(A,0,i-1); } }