堆(Heap)的實現

2021-08-15 10:50:07 字數 1363 閱讀 1195

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

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

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

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

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

#pragma once

#include#includeusing namespace std;

templatestruct less

};templatestruct greater

};template>

class heap

heap(vectora)

:array(a)

}heap(t *a, size_t size)

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

}~heap()

void push(t x)

void pop()

void adjustdown(int root)

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

else}}

void adjustup(int child)

else}}

void print()

cout << endl;

}int size()

protected:

vectorarray;

};void testheap()

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

hp.print();

}

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

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

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

堆 Heap 的實現

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

堆(Heap)的實現

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

資料結構 堆的實現(heap)

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