本文只使用了堆的方法,堆的詳細介紹及方法介紹:
詳解堆及方法!
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 10make_heap()和push_heap()中的第三個引數要一致,如果在push_heap()中的第三個引數改變,不能保證生成的是堆。插入元素之後:1.5 6 2.5 6.5 8 12 3.5 10 11
刪除最大/小元素:
把堆的第乙個元素放到最後,保證剩餘的元素依舊是堆。
在容器中,就可以把最後乙個元素刪除。如果是大頂堆,那麼刪除的就是最大值;如果是小頂堆,那麼刪除的就是最小值。
//刪除最小元素
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,...