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

2022-09-26 00:51:13 字數 2345 閱讀 4278

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

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

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

using system;

using system.collections.generic;

namespace structscript

public binaryheap(int capacity)

mitems = new t[capacity];

mcomparer = comparer.default;

} ///

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

///

///

///

public bool enqueue(t value)

mitems[mcount++] = value;

int position = bubbleup(mcount - 1);

return (position == 0);

} ///

/// 取出堆的最小值

///

///

public t dequeue()

pr 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[news程式設計客棧ize];

array.copy(mitems, 0, temp, 0, mcount);

mitems = temp;

} public void clear()

///

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

///

private void bubbledown()

else}}

///

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

///

///

///

private int bubbleup(int startindex)

else

startindex = parent;

}return startindex;

} }}

附上,測試用例:

using system;

namespace structscript

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

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