C 堆的方法及操作

2021-10-23 14:53:47 字數 2367 閱讀 5973

本文只使用了堆的方法,堆的詳細介紹及方法介紹:

詳解堆及方法!

1.

make_heap()

//建立堆

2.push_heap()

//新增元素

3.pop_heap()

//刪除最大/小元素

4.is_heap()

//判斷序列是否為堆

5.sort_heap()

//堆排序

第三個引數:

less< double >(),建立大頂堆

greater< double >(),建立小頂堆

預設建立的是大頂堆

#include

#include

#include

using

namespace std;

intmain

(int argc,

char

** ar**)

輸出:

大頂堆:12 10 3.5 6.5 8 2.5 1.5 6

小頂堆:1.5 6 2.5 6.5 8 12 3.5 10

先向容器中新增元素,之後利用該函式,將新增的元素重新排列進堆中。

#include

#include

#include

using

namespace std;

intmain

(int argc,

char

** ar**)

printf

("\n");

//最小堆中插入元素

numbers.

push_back(11

);push_heap

(numbers.

begin()

,numbers.

end(

),greater<

double

>()

);for(

int i=

0;isize()

;i++

)return0;

}

輸出:

初始最小堆:1.5 6 2.5 6.5 8 12 3.5 10

插入元素之後:1.5 6 2.5 6.5 8 12 3.5 10 11

make_heap()和push_heap()中的第三個引數要一致,如果在push_heap()中的第三個引數改變,不能保證生成的是堆。

刪除最大/小元素:

把堆的第乙個元素放到最後,保證剩餘的元素依舊是堆。

在容器中,就可以把最後乙個元素刪除。如果是大頂堆,那麼刪除的就是最大值;如果是小頂堆,那麼刪除的就是最小值。

//刪除最小元素

pop_heap

(numbers.

begin()

,numbers.

end(

),greater<

double

>()

);double m=numbers.

back()

; cout<<

"最小值為:"

pop_back()

;

判斷序列是否為堆

使用該方法時,可能會報錯,大致意思是說:沒有這個方法

如何改正:工具->編譯器選項->程式

g++部分改為:g++ -std=c++11

if

(is_heap

(numbers.

begin()

,numbers.

end(

),greater<

double

>()

))else

is_heap()的第三個引數,要和make_heap()中的第三個引數一致,否則會產生錯誤的判斷。

將序列作為堆進行排序,如果不是堆,那麼會報錯

sort_heap

(numbers.

begin()

,numbers.

end(

),greater<

double

>()

);

第三個引數要和make_heap()的第三個引數一致

小頂堆,呼叫函式會降序排序

大頂堆,呼叫函式會公升序排序

堆的序列不一定是有序的,但有序的序列一定是堆。

堆操作及應用

1.堆是乙個完全二叉樹,堆主要設計到的操作有插入,刪除,堆化。2.堆的主要應用有堆排序 從小到大排序,使用大頂堆 從大到小排序,使用小頂堆。3.下面以大頂堆為例,給出實現 view code 1 include 2 include 3 4using namespace std 56 大頂堆的實現 7...

堆的建立及基礎操作

建立乙個堆 void creatheap heap hp,int array,int size hp capacity size 搬移 for i i size size hp size size 找數的倒數第乙個非葉子結點 int last size 2 1 最後乙個結點是size 1,雙親就是再...

堆的實現及相關操作

堆 是一種特殊的完全二叉樹 大堆 左右孩子結點均小於父親結點 小堆 左右孩子結點均大於父親結點 用順序表來表示堆 typedef int hpdatatype typedef struct heap heap 堆的建立 void heapcreat heap hp,hpdatatype array,...