演算法導論 第六章 堆排序 6 5 8

2022-07-01 23:45:08 字數 1376 閱讀 6848

題目描述

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).

1

class 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 ...