C 實現大根堆

2021-09-19 17:15:28 字數 1433 閱讀 9830

一、堆的定義

堆的物理儲存結構是一維陣列,邏輯儲存結構是完全二叉樹。

堆的基本操作包括: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個結點的完全二叉樹。那麼基於完全二叉樹的...