C 資料結構 18 堆

2021-08-30 08:38:52 字數 1626 閱讀 1920

堆的實現通過構造二叉堆(binary heap),實為二叉樹的一種;由於其應用的普遍性,當不加限定時,均指該資料結構的這種實現。這種資料結構具有以下性質。

任意節點小於(或大於)它的所有後裔,最小元(或最大元)在堆的根上(堆序性)。 

堆總是一棵完全樹。即除了最底層,其他層的節點都被元素填滿,且最底層盡可能地從左到右填入。

將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

簡單來說,堆的儲存結構是陣列,邏輯結構是一棵完全二叉樹,通過索引的方式表示二叉樹父節點和孩子節點的關係,父節點大於孩子節點叫大根堆,反之叫小根堆.堆支援的主要操作有:入堆,出堆,調堆,堆排序,其中插入操作複雜度為o(logn)o(logn),因此堆排序的複雜度是o(nlogn)o(nlogn)

實現主要實現幾個操作push,pop

1.插入:

也就是,首先插入一定是插入到完全二叉樹的最右下,對應陣列中,也就是back()的位置,那麼為了滿足堆的性質,就需要不斷的上溯,也就是將新插入的元素往上到合適的位置.這裡沿用stl中的實現方式,並不是直接的swap,而是先生成乙個holeinex也就是產生乙個空洞,這個空洞就是待插入的位置,但是這個空洞需要不斷的上溯到合適位置,然後將新值插入即可.

2.彈出:

彈出堆中的最大值/最小值,對應的就是堆頂元素,陣列索引位置為0或者1(取決於實現)。這個時候將堆頂元素放到末尾(覆蓋最後乙個元素),堆頂的這個位置就變成了空洞了,此時需要將原來的末尾的元素插入到這個空洞中,就需要將這個空洞下沉到合適位置,然後將元素插入,並且堆大小減1

3.排序:

pop操作每次都會彈出最大或者最小的元素到堆尾,那麼執行n-1次彈出操作,陣列就有序了。

堆可分為大頂堆和小頂堆

大頂堆就是最大的元素為根元素,小頂堆最小的元素是根元素

插入新節點-向上滲透(先把節點插入到最後,和父節點依次比大小)

刪除根節點-向下滲透(先把最後乙個節點放置到根節點,再依次比較大小)

#ifndef __maxheap_h__

#define __maxheap_h__

#include using namespace std;

templateclass maxheap

;templatemaxheap::maxheap(int mx)//建構函式

templatemaxheap::~maxheap()

templatebool maxheap::isempty() //檢視是否為空

templatevoid maxheap::push(const t&e) //插入資料

templatevoid maxheap::trickup(int index) //向上滲透

templatevoid maxheap::pop() //刪除

templatevoid maxheap::trickdown(int index)

headarry[index]=top; //把top插入到這個裡面

}#endif // __maxheap_h__

#include #include "maxheap.h"

using namespace std;

int main()

C 資料結構 堆

堆 一種可被視為完全二叉樹的結構,實現有多種方法 一 c stl 優先佇列實現 1.首先寫好佇列標頭檔案 include 2.定義乙個int型 值小的數優先順序高 先出佇列 的佇列 小根堆 最後的 與 間注意留空格 priority queue,greater a 大根堆的定義 priority q...

資料結構 堆 C

二叉堆堆排序 堆 heap 分為二叉堆 二項式堆 斐波那契堆,堆是非線性資料結構,相當於一維陣列,有兩個直接後繼。堆又被稱為優先佇列,儘管名為優先佇列,但堆並不是佇列。因為佇列遵循first in,first out,但是堆是按照元素的優先順序取出元素。所以 堆 是實現排程器的理想資料結構。堆排序與...

資料結構 堆

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