附上一張總結圖
堆是一類完全二叉樹,常用於實現排序,選擇最小(大)值和優先佇列等
**優先佇列:**一種特殊的佇列,佇列中元素出棧的順序是按照元素的優先權大小,而不是元素入隊的先後順序。
堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:
即按完全二叉樹的結點編號排列,n個結點的關鍵字序列稱為堆。
堆可分為:
堆的儲存結構型別與完全二叉樹有所不同,定義如下:
typdefstruct heap;
//堆型別
/* 假設關鍵字型別為整型,大頂堆和小頂堆的優先函式可分別定義如下: */
intgreatprior
(int x,
int y)
intlessprior
(int x,
int y)
堆的篩選:將堆中指定的以 pos 結點為根的子樹調整為子樹,其前提是 pos 結點的左右子樹均為子堆。
篩選操作的過程:
演算法如下:
status swapheapelem
(heap &h,
int i,
int j)
temp = h.rcd[i]
; h.rcd[i]
= h.rcd[j]
; h.rcd[j]
= temp;
return ok;
}void
shiftdown
(heap &h,
int pos)
if(h.
prior
(h.rcd[pos]
.key,h.rcd[lc]
.key)
)swapheapelem
(h, pos, lc)
;//否則pos和較優先者lc交換位置
pos = lc;
//繼續向下調整
}}
該篩選演算法的時間複雜度為o(logn)
插入操作:將插入元素加到堆尾,此時須判別堆尾和其雙親結點是否滿足堆特性,若不滿足,則需要進行向上調整,將插入元素與雙親交換;交換後,插入元素若存在雙親且此雙親結點不滿足堆特性,則需要繼續重複上述過程。
步驟:
演算法如下:
status insertheap
(heap &h, rcdtype e)
return ok;
}
該插入演算法的時間複雜度為o(logn)。
篩選與插入區別:
演算法如下:
void
makeheap
(heap &h, rcdtype *e,
int n,
int size,
int tag,
int(
* prior)
(keytype,keytype)
)}
該建堆演算法的時間複雜度為o(n)。
操作:刪除堆頂結點後,需對新的堆頂結點進行篩選
演算法如下:
status removefirstheap
(heap &h, rcdtype &e)
堆排序屬於選擇類排序。
選擇類排序的基本思想:在 n 個記錄中,第 i 趟(i = 1,2,…,n-1)在第 i 到 n 個記錄中選取關鍵字最小的記錄作為有序序列中的第 i 個記錄。選取最小關鍵字的策略決定了選擇類排序演算法的效率。
堆排序可採用大頂堆進行公升序排序,採用小頂堆進行降序排序。
以大頂堆公升序排序為例
演算法如下:
void
heapsort
(rcdsqlist &l)
}
堆排序演算法的時間複雜度最壞為o(nlogn),空間複雜度為o(1)。
樹 二叉樹 堆
樹 樹是乙個無向無環圖,n個節點正好有n 1條邊,再任意加上一條邊就可以構成迴路。乙個結點的上乙個結點是這個結點父結點,這個節點是子結點,並且父結點和子結點是相對的。特別的,如果乙個結點沒有父結點,那這個結點是根節點 乙個結點沒有子結點,它是葉節點。二叉樹 如果乙個樹除了葉結點之外的其他每個結點都不...
二叉堆(完全二叉樹)
最小堆的實現 最小堆是一顆完全二叉樹 這裡用陣列實現完全二叉樹 index 0 1 2 3 4 5 6 value 空 a b c d 任意index,其父親為index 2,左兒子為2 index,右兒子為2 index 1 時間複雜度 o logn include includeusing na...
樹 二叉樹 滿二叉樹 完全二叉樹 堆 概念彙總
樹 乙個擁有n 個節點和n 1 條邊的乙個有向無環圖。二叉樹 每個節點最多有兩個子樹的樹結構。滿二叉樹 除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹。完全二叉樹 由滿二叉樹而引出 二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數 滿二叉 樹 第 h...