演算法總結 堆排序

2021-05-01 23:48:26 字數 1860 閱讀 4522

在軟體設計相關領域,"堆(heap)"的概念主要涉及到兩個方面:

堆排序的時間複雜度是o(nlgn),與快速排序達到相同的時間複雜度. 但是在實際應用中,我們往往採用快速排序而不是堆排序. 這是因為快速排序的乙個好的實現,往往比堆排序具有更好的表現.堆排序的主要用途,是在形成和處理優先順序佇列方面. 另外, 如果計算要求是類優先順序佇列(比如, 只要返回最大或者最小元素, 只有有限的插入要求等), 堆同樣是很適合的資料結構.

堆一般用陣列表示,比如陣列a. 陣列的長度length(a), 堆在陣列中的元素個數heapsize(a). 一般說來, heapsize(a) <= length(a), 因為陣列a當中可能有一些元素不在堆中.

假設節點i是陣列a中下標為i的節點.

含有n個元素的堆a的高度是:

floor(lgn)

保持堆的性質.假設陣列a和下標i, 假定以left(i)和right(i)為根結點的左右兩棵子樹都已經是最大堆, 節點i的值可能小於其子節點. 調整節點i的位置.

演算法的c#實現:

public

void

maxheapify( int

a, int heapsize, int

i )//compare larger node with right child

if ( right <= heapsize && a[right] > a[i])

//exchange i with the larger child

if(larger != i )

}

時間複雜度與樹的高度成正比, 為 o(lgn).

從乙個給定的陣列建立最大堆.子陣列a[ floor(n/2)+1 ....  ... n]中的元素都是樹的葉節點(完全二叉樹的基本性質) .從索引 ceiling(n/2)開始一直到1, 對每乙個元素都執行maxheapify, 最終得到乙個最大堆.

演算法的c#實現:

public

void

buildmaxheap( int

a )}

時間複雜度依賴於maxheapify o(h) (h - 樹的高度) ,buildmaxheap(a)的時間複雜度是o(n).
堆排序演算法的基本思想是, 將陣列a建立為乙個最大堆, 然後交換堆的根(最大元素)和最後乙個葉節點x, 將x從堆中去掉形成新的堆a1, 然後重複以上動作,直到堆中只有乙個節點.

演算法的c#實現:

public

void

heapsort( int

a )}

堆排序的時間複雜度是o(nlgn).
增加某乙個元素的優先順序後(元素的值), 該元素應該向上移動,才能保持堆的性質.
演算法的c#實現:
public

void

heapincreasekey( int

a, int

index, int

key )

}

時間複雜度: o(lgn)
主要思路是, 將堆的最後乙個葉節點之後, 擴充套件乙個為無窮小的新葉節點, 然後增大它的值為x的值
演算法的c#實現是:
public

void

heapinsert( int

a, int

key )

時間複雜度o(lgn)

堆排序演算法 總結

最近面試,老是被問到堆排序演算法。回答時老是感覺思路不清楚,現在總結一下,把思路弄清楚的。1.堆排序是利用堆的特性對記錄序列進行排序的一種排序方法。好的那麼堆得特性是什麼呢?堆得定義 堆是滿足下列性質的數列 如下圖最開始是乙個小頂堆。當把97和13 交換後不是堆了,所以我們要調整根節點使之成為堆即篩...

堆排序演算法 總結

最近面試,老是被問到堆排序演算法。回答時老是感覺思路不清楚,現在總結一下,把思路弄清楚的。1.堆排序是利用堆的特性對記錄序列進行排序的一種排序方法。好的那麼堆得特性是什麼呢?堆得定義 堆是滿足下列性質的數列 如下圖最開始是乙個小頂堆。當把97和13 交換後不是堆了,所以我們要調整根節點使之成為堆即篩...

堆排序演算法 總結

分類 資料結構 it 面試 2011 09 22 11 39 10991人閱讀收藏 舉報演算法面試 最近面試,老是被問到堆排序演算法。回答時老是感覺思路不清楚,現在總結一下,把思路弄清楚的。1.堆排序是利用堆的特性對記錄序列進行排序的一種排序方法。好的那麼堆得特性是什麼呢?堆得定義 堆是滿足下列性質...