C 資料結構之最小堆的實現方法

2021-10-25 21:49:09 字數 2827 閱讀 6240

最小堆

基本思想:堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的,每次都取堆頂的元素,將其放在序列最後面,然後將剩餘的元素重新調整為最小(大)堆,依次類推,最終得到排序的序列。

堆排序分為大頂堆和小頂堆排序。大頂堆:堆對應一棵完全二叉樹,且所有非葉結點的值均不小於其子女的值,根結點(堆頂元素)的值是最大的。而小頂堆正好相反,小頂堆:堆對應一棵完全二叉樹,且所有非葉結點的值均不大於其子女的值,根結點(堆頂元素)的值是最小的。

舉個例子:

(a)大頂堆序列:(96, 83,27,38,11,09)

(b)小頂堆序列:(12,36,24,85,47,30,53,91)

實現堆排序需解決兩個問題:

1. 如何將n 個待排序的數建成堆?

2. 輸出堆頂元素後,怎樣調整剩餘n-1 個元素,使其成為乙個新堆?

首先討論第二個問題:輸出堆頂元素後,怎樣對剩餘n-1元素重新建成堆?

調整小頂堆的方法:

1)設有m 個元素的堆,輸出堆頂元素後,剩下m-1 個元素。將堆底元素送入堆頂((最後乙個元素與堆頂進行交換),堆被破壞,其原因僅是根結點不滿足堆的性質。

2)將根結點與左、右子樹中較小元素的進行交換。

3)若與左子樹交換:如果左子樹堆被破壞,即左子樹的根結點不滿足堆的性質,則重複方法 (2).

4)若與右子樹交換,如果右子樹堆被破壞,即右子樹的根結點不滿足堆的性質。則重複方法 (2).

5)繼續對不滿足堆性質的子樹進行上述交換操作,直到葉子結點,堆被建成。

稱這個自根結點到葉子結點的調整過程為篩選。如圖:

再討論第乙個問題,如何將n 個待排序元素初始建堆?

建堆方法:對初始序列建堆的過程,就是乙個反覆進行篩選的過程。

1)n 個結點的完全二叉樹,則最後乙個結點是第n/2個結點的子樹。

2)篩選從第n/2個結點為根的子樹開始,該子樹成為堆。

3)之後向前依次對各結點為根的子樹進行篩選,使之成為堆,直到根結點。

如圖建堆初始過程:無序序列:(49,38,65,97,76,13,27,49)

c#演算法實現:

using system;

using system.collections.generic;

namespace structscript

public binaryheap(

int capacity)

mitems = new t[capacity]

; mcomparer = comparer

.default;}//

//// 增加元素到堆,並從後往前依次對各結點為根的子樹進行篩選,使之成為堆,直到根結點

///<

/summary>///

"value"

>

<

/param>///

<

/returns>

public bool enqueue(t value)

mitems[mcount++]

= value;

int position = bubbleup(mcount -1)

;return

(position ==0)

;}///

/// 取出堆的最小值

///<

/summary>///

<

/returns>

public t dequeue()

private t dequeue(

bool shrink)

t result = mitems[0]

;if(mcount ==1)

else

if(shrink)

return result;}

private void shrinkstore()}

private void resizeitemstore(

int newsize)

t temp = new t[newsize]

; array.copy(mitems,

0, temp,

0, mcount)

; mitems = temp;}

public void clear()//

//// 從前往後依次對各結點為根的子樹進行篩選,使之成為堆,直到序列最後的節點

///<

/summary>

private void bubbledown(

)else}}

////// 從後往前依次對各結點為根的子樹進行篩選,使之成為堆,直到根結點

///<

/summary>///

"startindex"

>

<

/param>///

<

/returns>

private int bubbleup(

int startindex)

else

startindex = parent;

}return startindex;}}

}

附上,測試用例:

using system;

namespace structscript}}

using system;

namespace structscript

}}

測試用例,執行結果依次輸出1,2。

總結到此這篇關於c#資料c#教程結構之最小堆實現的文章就介紹到這了

C 資料結構之最小堆的實現方法

基本思想 堆對應一棵完全二叉樹,且所有非葉結點的值均不大於 或不小於 其子女的值,根結點 堆頂元素 的值是最小 或最大 的,每次都取堆頂的元素,將其放在序列最後面,然後將剩餘的元素重新調整為最小 大 堆,依次類推,最終得到排序的序列。堆排序分為大頂堆和小頂堆排序。大頂堆 堆對應一棵完全二叉樹,且所有...

資料結構之最小堆的實現C 版

完全二叉樹之所以用陣列的方式存在,在於他的乙個特性 若子節點為i,則父節點為 i 1 2,注意c 特性,該結果肯定是個整數。若父節點為j,則子節點必為2 j 1 則在陣列裡面可以非常方便的通過下標去獲取。建堆的核心思想 堆在index的值為heap index 然後其兩個孩子的值邊可求得,左孩子為h...

6 資料結構 最小堆

開發過程,經常需要對資料集合進行維護。維護資料結合的資料結構可統稱為容器。最小堆是維護資料集合的容器的一種,最小堆具備如下性質 設v i 為位置i的元素值 1.對維護的n個元素,順序儲存於索引為1 n的陣列位置 2.對索引i,若索引2 i n,有v i v 2 i 若索引2 i 1 n,有v i v...