資料結構之堆

2021-06-22 05:07:46 字數 1895 閱讀 5923

堆(我們這裡指二叉堆)是一棵完全二叉樹,並且祖先節點的所有子孫節點都不小於(或不大於)祖先節點的值。

通常我們把根節點作為第一層的話,那麼深度為h的堆就有2^(h-1)~2^h-1個節點,顯然擁有n個節點的堆,其高度為lgn。也就是說對堆進行插入語刪除操作我們都需要lgn的時間。由於堆的完全樹的性質,因此可以用線性結構(陣列)來儲存。

首先定義堆的乙個類,考慮到常用的樹的操作,定義了插入節點操作,刪除最小節點操作等操作:還有一點需要注意的是,根據堆的特點(祖先節點不大於/小於子孫節點的值),可將堆分為最大堆和最小堆,在此以最大堆舉例

(資料結構與演算法分析--c++描述一書中以最小堆為例,在此筆者有個疑問,就是此書作者以vector為儲存結構,currentsize表示當前堆中元素個數,在判斷是否上溢時,以currentsize==array.size()-1為判斷條件(其中array為vector),筆者懷疑作者是否搞反了,因為vector::size()返回的是當前元素個數,好吧,我們繼續)

#include#include#define maxsize 1024

using namespace std;

templateclass maxheap

;

然後是各成員函式的實現

1、建構函式,此處以乙個陣列來初始化,首先要判斷是否會有上溢的可能,賦值後,還要將陣列序列初始化為最大堆結構

template
maxheap::maxheap(const t item,int m)

此處buildheap()函式是為了初始化堆的:

templatevoid maxheap::buildheap()

其原理即是從最後乙個非葉子節點開始一次進行sift(篩選)過程:

templatevoid maxheap::sift(int k,int n)

原理就是判斷其雙親是否小於新插入的點,是的話,雙親降為孩子,而孩子公升為雙親

3、刪除最大點,由於刪除最大殿後,最後乙個節點必須插入合適的地方,所以從上到下逐層篩選。當然刪除之前要判斷樹是否為空

templatebool maxheap::isempty()

templatet maxheap::deletemax()

刪除最小節點後,元素個數減一,所以呢最後乙個節點要重新選擇合適的插入點,只要另data[1]=最後乙個元素,然後篩選sift就可以啦

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。在優先佇列

中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。而優先佇列的實現往往就是由堆來實現的,我們只要通過上述的maxheap::insert()來不斷的插入,並通過maxheap::deletemax()就可以實現優先佇列啦

採用堆排序可以實現o(nlgn)的時間複雜度,所以是一種較為快速的排序方法。堆排序的實現由於不需要刪除最大項,因此可以通過不斷的將當前最大元素放至當前堆的最後即可。

在之前的類介面中,新增乙個heapsort()函式

template
void maxheap::heapsort()

; maxheapheap(data,8);

heap.heapsort();

heap.print();

return 0;

}

可以新增乙個print函式輸出排序結果

templatevoid maxheap::print()

over~

資料結構之堆

原帖 對於堆的資料結構的介紹,在網上搜了下,具體講的不是很多。發現比較好的一篇介紹堆的部落格是在此感謝他。通過對上面那篇部落格的學習,然後自己也去翻了下 演算法導論 裡面關於堆排序 heapsort 的介紹。這樣就對堆有了更加深刻的認識,在此,我結合自己的一點點理解,主要還是基於上面那篇部落格的內容...

資料結構之堆

1.概述 堆 也叫優先佇列 是一棵完全二叉樹,它的特點是父節點的值大於 小於 兩個子節點的值 分別稱為大頂堆和小頂堆 它常用於管理演算法執行過程中的資訊,應用場景包括堆排序,優先佇列等。2.堆的基本操作 堆是一棵完全二叉樹,高度為o lg n 其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,...

資料結構之堆

堆是一棵完全被填滿的二叉樹,可以的例外是在底層,底層上的元素從左到右填入。這樣的樹被稱為完全二叉樹。堆有兩種情況,一種是大堆,就是最大元素在最根部的,一種是小堆,就是最小元素位於最根部的。下面是一棵完全二叉樹的結構圖 堆可以使我們想要的操作得到快速的執行,為了達到快速執行的目的,一般來說堆的最小元應...