堆 heap 的操作c

2021-09-19 07:03:02 字數 4607 閱讀 9922

堆的操作函式定義在標頭檔案 algorithm 中

以下的**中均省略了輸出的**

vectora;

for (int i = 0; i < a.size(); i++)

函式:make_heap()根據指定的迭代器區間以及乙個可選的比較函式,來建立乙個heap,預設建立大根堆

// 1

template< class randomit >

void make_heap( randomit first, randomit last );

// 2

template< class randomit, class compare >

void make_heap( randomit first, randomit last, compare comp );

vectora;

make_heap(a.begin(), a.end());

輸出堆a:

指定比較函式建立大根堆:

指定比較函式建立小根堆:

函式:push_heap()把指定區間的最後乙個元素插入到heap中

注:在使用之前要想vector末尾中插入元素

// 1

template< class randomit >

void push_heap( randomit first, randomit last );

// 2

template< class randomit, class compare >

void push_heap( randomit first, randomit last, compare comp );

先用make_heap來構造乙個堆,然後在容器末尾追加元素之後,把新的迭代器區間傳給push_heap,這樣新尾部元素也被新增到堆中。

vectora;

make_heap(a.begin(), a.end(),less());

a.push_back(100);

push_heap(a.begin(), a.end());

結果:

預設使用的是大根堆的比較方式

注意:使用push_heap(f, l)的話,呼叫者需要確保(f, l-1)已經是乙個堆. push_heap(f, l)僅僅會把*(l)插入到(f, l-1)這個區間形成的堆中

若使用的是不同的比較函式:

100在插入堆使用的是小根堆的比較方式,而他的父節點4比100小,且4-3-100所形成的堆中已經是小根堆,所以就不進行替換。

函式:pop_heap()彈出heap頂元素, 將其放置於區間末尾

// 1

template< class randomit >

void pop_heap( randomit first, randomit last );

// 2

template< class randomit, class compare >

void pop_heap( randomit first, randomit last, compare comp );

它的作用是:交換first和*(last-1), 然後把(first, last-1)建成乙個max(min) heap. 也就是說把堆頂的最大元素交換到區間尾,然後把除了尾部的元素的剩餘區間重新調整成堆。

注意的是,呼叫者要保證,在呼叫pop_heap時(first, last)已經是乙個堆(使用相同的排序準則)。

函式:sort_heap()堆排序演算法,通常通過反覆呼叫pop_heap來實現

是經典的堆排序演算法,通過每次彈出堆頂直到堆為空,依次被彈出的元素就組成了有序的序列了

使用sort_heap(f, l)處理過的區間因為已經有序,就不再是乙個最大堆或者是最小堆了。

函式:is_heap()判斷給定區間是否是乙個最大堆或者最小堆//是返回1,不是返回0

//1 (since c++11)

template< class randomit >

bool is_heap( randomit first, randomit last );

//2 (since c++11)

template< class randomit, class compare >

bool is_heap( randomit first, randomit last, compare comp );

vectora;

bool flag = is_heap(a.begin(), a.end());

cout << "before heap a:";

if (flag)

cout << "此時堆是乙個最大堆或者最小堆" << endl;

else cout << "此時堆不是乙個最大堆或者最小堆" << endl;

make_heap(a.begin(), a.end(),less());

flag = is_heap(a.begin(), a.end());

cout << "after heap a:";

if (flag)

cout << "此時堆是乙個最大堆或者最小堆" << endl;

else cout << "此時堆不是乙個最大堆或者最小堆" << endl;

函式:is_heap_until()

//1 (since c++11)

template< class randomit >

randomit is_heap_until( randomit first, randomit last );

//2 (since c++11)

template< class randomit, class compare >

randomit is_heap_until( randomit first, randomit last, compare comp );

vectora;

auto iter = is_heap_until(a.begin(), a.end());

cout << "iter:" << *iter << endl;

我們可以自己分析得到在3的位置就不滿足小根堆的規律,在3之前的元素滿足小根堆的規律,所以iter應該是5

Python 堆(heap)的基本操作

python 堆 heap 的基本操作 import heapq 載入heap庫,heap指的是最小堆使陣列轉化為堆 heapq.heapify list heap 1,3,4,2,6,8,9 heapq.heapify heap heap 1,2,4,3,6,8,9 為heap增加元素 heap ...

堆(Heap)的實現

這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖 堆的本質就是乙個陣列 上圖中,紅色的是值,黑色的是下標 簡單的來說就是把乙個陣列看成是二叉樹,就像上圖 大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet child...

堆 Heap 的實現

什麼是堆?優先佇列 opriority queue 特殊的 佇列 取出元素的順序是依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆有兩大特性 1,結構性 是一顆完全二叉樹。2,有序性 每個葉子結點到根結點都是有序的,如果是公升序,那麼就是最大堆,否則為最小堆。這些是堆 下面的不是堆 ...