最小堆
基本思想:堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的,每次都取堆頂的元素,將其放在序列最後面,然後將剩餘的元素重新調整為最小(大)堆,依次類推,最終得到排序的序列。
堆排序分為大頂堆和小頂堆排序。大頂堆:堆對應一棵完全二叉樹,且所有非葉結點的值均不小於其子女的值,根結點(堆頂元素)的值是最大的。而小頂堆正好相反,小頂堆:堆對應一棵完全二叉樹,且所有非葉結點的值均不大於其子女的值,根結點(堆頂元素)的值是最小的。
舉個例子:
(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...