堆(Heap)的實現

2022-07-11 07:57:09 字數 1837 閱讀 3523

這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖

堆的本質就是乙個陣列(上圖中,紅色的是值,黑色的是下標)簡單的來說就是把乙個陣列看成是二叉樹,就像上圖

大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet=(child-1)/2

利用這個關係就可以實現堆了,堆的基本方法有構造,析構,插入,刪除,像大堆小堆這樣特殊的堆肯定是要有調整函式來保持他們的特性的,所以我還寫了向上調整和向下調整的函式

為了讓大堆和小堆之間切換自如(就是方便維護),我寫了兩個仿函式,建立堆的物件時傳個模版引數就好了

1

#pragma once

2 #include3 #include4

using

namespace

std;

56 template

7struct

less813

};14

15 template

16struct

greater

1722

};23

2425

2627

28 template

29class

heap

3036 heap(vectora)

37:array(a)

3843

}44 heap(t *a, size_t size)

4550

for (int i = (array.size() - 2) / 2; i >= 0; --i)

5154

}55 ~heap()

5659

void

push(t x)

6064

void

pop()

6570

void adjustdown(int

root)

7179

if(compare(array[root], array[child]))

8085

else

8689}90

}91void adjustup(int

child)

92102

else

103106

}107

}108

void

print()

109114 cout <

115}

116int

size()

117120

protected

:121 vectorarray;

122};

123124

125void

testheap()

126;

129for (int i = 0; i < 10; ++i)

130133

hp.print();

134 }

當乙個乙個push插入的時候我們只需要把這個元素插入到陣列的最後,然後順著二叉樹向上調整就可以了(只需要調整這一條線)

刪除頭元素(根節點)的時候,為了不破壞結構,我們選擇先跟處於最後位置的元素交換,之後在末尾刪除掉「根節點」,然後因為最大值(最小值)被換到了根節點,不符合小堆(大堆)的結構要求,只需要順著這條路一直向下調整就可以了

我還寫了乙個建構函式接收的引數是乙個vector,這是把整個vector調整成大堆(小堆),先找到最後乙個元素的父親節點,一直往前向下調整就可以了,因為這個父親節點之前也肯定都是有孩子父親節點

堆(Heap)的實現

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

堆 Heap 的實現

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

資料結構 堆的實現(heap)

堆分為兩種 最大堆和最小堆 最大堆 父節點的值比每乙個子節點的值都要大。最小堆,父節點的值比每乙個子節點的值都要小。heap實現 heap.h include include include include include typedef int hpdatatype typedef struct ...