堆資料結構

2021-08-26 17:06:59 字數 1320 閱讀 6284

(二叉)堆資料結構是一種物件陣列,它可以被視為完全二叉樹,樹中的每個結點和陣列中存放該結點值的元素對應,樹中每一層都是滿的最後一層可能除外(最後一層從乙個結點左子樹開始填),堆陣列有兩個屬性物件乙個是length[a]是陣列元素個數,heap_size[a]是堆元素個數,其中heap_size[a]<=length[a],二叉堆有兩種一種是最大堆一種是最小堆,最大堆性質是a[parent[i]]>=a[i],即根節點元素值不小於孩子結點元素值;最小堆性質a[parent[i]]<=a[i],即根結點元素值不大於孩子結點元素值。在堆排序演算法中我們使用的是最大堆,最小堆通常在構造優先佇列時使用。結點在堆中的高度定義為從本結點到葉子結點的最長簡單下降路徑上邊的數目;定義堆的高度為樹根的高度。

保持堆性質的演算法:

#include#include#includeusing namespace std; int n; void input(int *v) void output(int *v) } void max_heapify_effective(int *v,int i)//非遞迴演算法 else break; } } int main()

建堆:思路:由於當陣列中存放n個元素的堆時,葉子結點的下標為n/2......n。基於這一性質我們可以自底向上的呼叫max_heapify()來將乙個陣列a[1......n]變成乙個最大堆。只需對子陣列a[n/2....1]操作。而a[n/2+1...n]都是樹的葉子因此可以看作是只含有乙個元素的堆。

void build_max_heap(int *v)

堆排序演算法:

思路:開始時,堆排序演算法先用build_max_heap將輸入的陣列a[1.....n]構成乙個最大堆。因為陣列中最大元素在根a[1],則可以通過它與a[n]交換來達到最終正確的位置。現在從堆中去掉結點n,新的根結點可能違背了最大堆的性質,這時需要呼叫max—heapify(a,1),讓a[1....n-1]重新構成最大堆,然後重複上面的過程,直到堆的大小從n一直降到2。

#include#include#includeusing namespace std; int n,p; void max_heapify(int *v,int i); void heapsort(); void build_max_heap(int *v)構//建最大堆演算法 void input(int *v) void output(int *v) } void max_heapify_effective(int *v,int i)//保持堆性質的非遞迴演算法 else break; } } void heapsort(int *v)//堆排序演算法 } int main()

注:max—heapify時間複雜度為o(lgn),heapsort的時間複雜度為o(nlgn)。

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...