這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖
堆的本質就是乙個陣列(上圖中,紅色的是值,黑色的是下標)簡單的來說就是把乙個陣列看成是二叉樹,就像上圖
大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet=(child-1)/2
利用這個關係就可以實現堆了,堆的基本方法有構造,析構,插入,刪除,像大堆小堆這樣特殊的堆肯定是要有調整函式來保持他們的特性的,所以我還寫了向上調整和向下調整的函式
為了讓大堆和小堆之間切換自如(就是方便維護),我寫了兩個仿函式,建立堆的物件時傳個模版引數就好了
1當乙個乙個push插入的時候我們只需要把這個元素插入到陣列的最後,然後順著二叉樹向上調整就可以了(只需要調整這一條線)#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 }
刪除頭元素(根節點)的時候,為了不破壞結構,我們選擇先跟處於最後位置的元素交換,之後在末尾刪除掉「根節點」,然後因為最大值(最小值)被換到了根節點,不符合小堆(大堆)的結構要求,只需要順著這條路一直向下調整就可以了
我還寫了乙個建構函式接收的引數是乙個vector,這是把整個vector調整成大堆(小堆),先找到最後乙個元素的父親節點,一直往前向下調整就可以了,因為這個父親節點之前也肯定都是有孩子父親節點
堆(Heap)的實現
這次實現了堆,這個堆不是指系統堆疊的堆,是一種資料結構,見下圖 堆的本質就是乙個陣列 上圖中,紅色的是值,黑色的是下標 簡單的來說就是把乙個陣列看成是二叉樹,就像上圖 大堆和小堆分別是指根節點比孩子節點的值大或者是小,看了上圖之後就可以發現,父親節點和孩子節點之間下表的關係,parnet child...
堆 Heap 的實現
什麼是堆?優先佇列 opriority queue 特殊的 佇列 取出元素的順序是依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆有兩大特性 1,結構性 是一顆完全二叉樹。2,有序性 每個葉子結點到根結點都是有序的,如果是公升序,那麼就是最大堆,否則為最小堆。這些是堆 下面的不是堆 ...
資料結構 堆的實現(heap)
堆分為兩種 最大堆和最小堆 最大堆 父節點的值比每乙個子節點的值都要大。最小堆,父節點的值比每乙個子節點的值都要小。heap實現 heap.h include include include include include typedef int hpdatatype typedef struct ...