priority queue的底層實現及數組建堆。

2021-07-30 08:45:26 字數 2104 閱讀 7165

注意:

1 如果要用到小頂堆,則一般要把模板的三個引數都帶進去。 stl裡面定義了乙個仿函式 greater<>,對於基本型別可以用這個仿函式宣告小頂堆

#include #include using namespace std;

int main()

getchar();

return 0;

}

2 為了指定第三個模板引數,我們必須將前兩個引數都指明出來(這是c++語法規則).

stack與queue注意事項:

1 stack不允許有遍歷行為,stack也不提供迭代器。sgi stl便以deque作為預設情況下stack底部結構,稱之為adapter(配接器)

2 除了deque之外,list也是雙向開口的資料結構

3 queue與stack的情況類似,不提供迭代器,也可以以list作為底層容器,預設為deque。

priority_queue的底層實現——heap

預設情況下priority_queue優先順序佇列是利用乙個max-heap最大堆完成,後者是乙個以vector表現的完全二叉樹。

「依權值高低自動遞減排序」

1 priority_queue允許使用者以任何次序將任何元素推入容器內,但取出時一定是從優先權最高(也即數值最高,最大堆)的元素開始取。

2 二叉堆,完全二叉樹,(由陣列實現,陣列來儲存所有節點,2*i+1,2*i+2,但是由於動態改變大小,所以不用array用vector)插入o(logn),刪除o(logn)

本人親自實現的堆排序過程:

#include #include #include using namespace std;

/*調整堆:預設最大堆,每次調整結束後,堆頂即為最大值。

類似於:向上冒泡的過程。

*/void maxheapfixdown(int a, int i, int n)

for (int k = 1; k <= n - 1; ++k)//建堆時相當於完成了一次堆調整,還需要n-1次堆調整。

}#define n 500

int main()

for (int i = 0; i < n; i++)

cout << endl;

cout << "********************" << endl;

heap_sort(a, n);

for (int i = 0; i < n; i++)

cout << endl;

system("pause");

return 0;

}

stl heap包括:

1 push_heap演算法:新元素插入在底層的vector的end()處。向上回溯

2 pop_heap演算法:把堆頂元素和數值末尾元素調換,向下回溯。

3 sort_heap演算法:持續對整個heap做pop_heap操作,每次將操作範圍從後向前縮減乙個元素。執行過後,原來的heap不再是個合法的heap了。

4 meak_heap演算法:找出第乙個需要重排的子樹頭部(n-2)/2,從當前位置向根節點回溯。

C STL的priority queue用法總結

翻了很多部落格的總結 1 標頭檔案 include 2 定義 cpp view plain copy priority queue int p 3 優先輸出大資料 priority queue type為資料型別,container為儲存資料的容器,functional為元素比較方式。如果不寫後兩個...

priority queue的常見用法

其底層是用堆來進行實現的 在優先佇列中,隊首元素一定是當前佇列中優先順序最高的那乙個 當然,可以在任何時候往優先佇列裡面加入push元素 而優先佇列底層的資料結構堆 heap 會隨時調整結構 使得每次的隊首元素都是優先順序最大的 1 定義 priority queuename 2 容器內元素的訪問 ...

PriorityQueue實現原理

priorityqueue priorityqueue是個基於優先順序堆的極大優先順序佇列 此佇列按照在構造時所指定的順序對元素排序,既可以根據元素的自然順序來指定排序 參閱 comparable 也可以根據 comparator 來指定 這取決於使用哪種構造方法。優先順序佇列不允許 null 元素...