如何構造最大堆和最小堆?

2021-10-10 19:37:08 字數 672 閱讀 5862

最大堆和最小堆又叫大頂堆和小頂堆(大根堆和小根堆),是二叉樹的一種排列方式。

最大堆:根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。

最小堆:根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。

堆排序的過程就是不斷構造最大堆的過程。堆排序的時間複雜度是o(nlogn).

c++中的優先佇列priority_queue可以用來構造最大堆和最小堆。在優先佇列中,元素被賦予優先順序,當訪問優先佇列時,優先順序最高的優先被訪問,即top()訪問的優先順序最高的元素。int元素預設越大優先順序越高。

1 //公升序佇列,小頂堆

2 priority_queue , greater> q;

3 //降序佇列,大頂堆

4 priority_queue , less>q;

5 6 //greater和less是std實現的兩個仿函式(就是使乙個類的使用看上去像乙個函式。其實現就是類中實現乙個operator(),這個類就有了類似函式的行為,就是乙個仿函式類了)

對於更複雜的資料結構,如結構體,需要自定義優先順序排序。

struct node

};struct compare

};priority_queue, compare> q{};

最大堆和最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...

最大堆和最小堆

最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。最小堆和最大堆的增刪改相似,其實就是把演算法中的大於改為小於,把小於改為大於。生成最大堆 最大堆通常都是一棵完...

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...