c 實現最大堆和最小堆

2021-10-03 19:08:06 字數 3603 閱讀 4323

堆是具有以下特性的完全二叉樹,每個結點的值都大於或等於其左右孩子結點的值,叫做最大堆;每個結點的值都小於或等於其左右孩子結點的值,叫做最小堆。

vector<

int> nums =

;

1、如果使用nums構建最大堆:

make_heap

(nums.

begin()

, nums.

end())

;//或

make_heap

(nums.

begin()

, nums.

end(

), less<

int>()

);

輸出nums的結果為

//最大堆是按照層序遍歷的順序存入vector的98

2670

1435

2、如果使用nums構建最小堆:

make_heap

(nums.

begin()

, nums.

end(

), greater<

int>()

);

輸出nums的結果為

031

4529

867

當使用上述的make_heap()建完堆後,如果vector使用push_back()插入資料或pop_back()刪除資料後,會破壞最大堆/最小堆的性質,所以需要調整堆,常用push_heap()和pop_heap()兩個方法

1、push_heap()用法是,vector先push_back(),後push_heap():

nums.

push_back(10

);push_heap

(nums.

begin()

, nums.

end(

), less<

int>()

);

輸出nums的結果:

//原vector 98

2670

1435

//push_back()後98

2670

1435

10//push_heap()後109

2680

1435

7

2、pop_heap()用法是,先pop_heap(),vector後pop_back():

pop_heap

(nums.

begin()

, nums.

end(

), less<

int>()

);nums.

pop_back()

;

輸出nums的結果:

//原vector98

2670

1435

//pop_heap()後87

2650

1439

//pop_back()後87

2650

143

為什麼pop_heap()的用法要反過來呢?

要從我們的目的來考慮,使用pop_heap()的絕大部分目的是要把堆頂元素pop出堆中,因為它最大或最小。如果先用vector的pop_back(),它刪除的不是堆頂元素(nums[0]),而是vector的最後乙個元素。可見這不是我們想要的結果:對於最大堆,最後乙個元素既不是最大,也不一定是最小;對於最小堆,最後乙個元素既不是最小,也不一定是最大。pop出來沒有意義。

觀察pop_heap()對堆做了什麼?

pop_heap()把堆頂元素放到了最後一位,然後對它前面的數字重建了堆。這樣一來只要再使用pop_back()把最後一位元素刪除,就得到了新的堆。

priority_queue

對於這個模板類priority_queue,它是stl所提供的乙個非常有效的容器。

作為佇列的乙個延伸,優先佇列包含在標頭檔案中。

優先佇列時一種比較重要的資料結構,它是有二項佇列編寫而成的,可以以o(log n)的效率查詢乙個佇列中的最大值或者最小值,其中是最大值還是最小值是根據建立的優先佇列的性質來決定的

優先佇列有三個引數,其宣告形式為:

priority_queue< type, container, function >
這三個引數,後面兩個可以省略,第乙個不可以。

其中:type:資料型別;

container:實現優先佇列的底層容器;

function:元素之間的比較方式;

對於container,要求必須是陣列形式實現的容器,例如vector、deque,而不能使list。

在stl中,預設情況下(不加後面兩個引數)是以vector為容器,以operator<為比較方式,所以在只使用第乙個引數時,優先佇列預設是乙個最大堆,每次輸出的堆頂元素是此時堆中的最大元素。

假設type型別為int,則:

bool empty() const

返回值為true,說明隊列為空;

int size() const

返回優先佇列中元素的數量;

void pop()

刪除佇列頂部的元素,也即根節點

int top()

返回佇列中的頂部元素,但不刪除該元素;

void push(int arg)

將元素arg插入到佇列之中;

//構造乙個空的優先佇列(此優先佇列預設為大頂堆)

priority_queue<

int> big_heap;

//另一種構建大頂堆的方法

priority_queue<

int,vector<

int>

,less<

int>

> big_heap2;

//構造乙個空的優先佇列,此優先佇列是乙個小頂堆

//如果是自己寫第三個引數,應該用「>」

priority_queue<

int,vector<

int>

,greater<

int>

> small_heap;

需要注意的是,如果使用lessless,需要標頭檔案:

#include

c++中priority_queue理解與使用

最大堆和最小堆

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

最大堆和最小堆

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

最小堆 最大堆的實現 c

最小堆 templateclass minheap int size const t min minheap insert const t x minheap deletemin t x void initialize t a,int size,int arraysize void deactiva...