題目描述
6.5-8heap-delete(a,i)操作能過將結點i從堆a中刪除。對於乙個包括n個元素的堆,請設計乙個能夠在o(lg n)時間內完成的heap-delete操作。
思路:把堆中的最後乙個元素a[a.heap-size]放到結點i上,然後a.heap-size - 1.
分三種情況:
(1) a[a.heap-size] = a[i] 無需調整,時間複雜度為o(1).
(2) a[a.heap-size] > a[i] 呼叫heap-increase-key(a, i, key) 時間複雜度為o(lg n).
(3) a[a.heap-size] < a[i] 呼叫max-heapiey(a, i),維護堆的性質,時間複雜度為o(lg n).
1class testcontroller extends
controllerelse
21if ($right
<= $heapsize && $a[$right] > $a[$largest
]) 24
if ($largest != $i
) 30}31
/**32* 增加某個鍵的值.
33*
34* @param array $a
35* @param int $i
36* @param int $heapsize
37* @access public
38* @return void
39*/
40public
function heapincreasekey($a, $i, $key,$heapsize)46
$a[$i] = $key;47
while ($i
<= 1 && $a[$parent] < $a[$i
]) 52}53
/**54* 刪除鍵.
55*
56* @param array $a
57* @param int $i
58* @param int $heapsize
59* @access public
60* @return void
61*/
62public
function heapdelete($a, $i, $heapsize)67
if ($a[$heapsize] == $a[$i
]) elseif ($a[$heapsize] > $a[$i
]) elseif ($a[$heapsize] < $a[$i
]) 74
$heapsize = $heapsize - 1;
75return$a;
76}77 }
演算法導論 第六章《堆排序》
本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...
演算法導論 第六章 堆排序
二叉 堆資料結構是一種陣列物件,如下圖所知,他可以被視為一顆完全二叉樹。其有如下性質 1 對於i節點 i表示下標 其父節點為li 2 左孩子節點為2i,右孩子節點為2i 1 2 最大堆滿足 a parent i a i 最小堆滿足 a parent i a i 3 堆的高度為 lgn 4 子陣列元素...
演算法導論第六章 堆排序
堆排序 主要是二叉堆,是乙個陣列,可以近似看作是一棵完全二叉樹。最壞情況執行時間為 n log n 主要性質 1.對於任意乙個下標index,書上寫的是左子女的下標為 2 index,右子女為 2 index 1 但是在實際程式設計中,下標是從0開始的,所以下標的變化應該為 左子女為2 index ...