一、堆的定義
堆的物理儲存結構是一維陣列,邏輯儲存結構是完全二叉樹。
堆的基本操作包括:insert–向堆中插入乙個元素,deletetop–刪除堆頂元素
上面的就是乙個大根堆,大根堆具有以下性質:每乙個節點的值都小於它父節點的值。我們也可以從上面的中看出來。但是需要注意的是,每乙個節點的值的大小與它所處的深度沒有必然的聯絡。
我們如果將這個最大堆存入陣列中,就需要按照索引順序存入:01
2345
6789
6040
2931
2716
1425
1526
公式如下:
當前節點的父節點 = (index - 1) / 2
當前節點的左子節點 = index * 2 + 1
當前節點的左子節點 = index * 2 + 2
二、如何實現乙個堆
/*
*@大根堆的實現
*@*@
*@ */
#include using namespace std;
class maxheap
bool isempty()
int parent(int index) }
int leftchild(int index)
int rightchild(int index)
//定義插入操作
void add(int num)
//定義上浮操作
void siftup(int index) }
//定義下沉操作,每乙個父節點的值都要大於子節點
void siftdown(int index)
else
num = index * 2 + 1;
} else
swap(init_vec[index], init_vec[num]);
index = num;
} }
//返回最大元素,堆頂元素
int findmax()
//取出堆頂,由於vector沒有pop_front(),所以需將堆頂與最後乙個元素交換,再pop_back(),再下沉
int extractmax()
void swap(int &i,int &j)
vectorinit_vec;
}; int main()
; heap_0.add(70);
cout參考:資料結構------堆(二、堆的實現)
大根堆實現
堆 有兩種,一種是大根堆,另一種是小根堆。大根堆的意思是在跟的位置那個數是最大的。同理,小根堆的根元素是最小的。堆是乙個滿的二叉樹,除了最後乙個節點可能不是滿的。所以用陣列去陣列去實現它。乙個節點的index為i,則這個節點的兩個子節點的下標應該為2 i 1和2 i 2 父結點那就是 i 1 2 下...
C 大根堆與小根堆
c 中,大根堆和小根堆可以使用優先佇列實現。include priority queuepq1 大根堆 priority queue,greater pq2 小根堆該stl支援自定義比較函式,但與sort不同,不支援直接使用lambda函式。自定義的小根堆如下。struct cmp 自定義小根堆 p...
堆(大根堆 小根堆)
堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...