最小堆排序

2022-04-17 12:05:03 字數 2701 閱讀 5762

堆的定義是:n個元素的序列,當且僅當滿足如下關係時被成為堆

(1)ki

<= k2i 且 ki

<= k2i-1

或 (2) ki >= k2i 且 ki >= k2i-1 

(i = 1,2,…[n/2])

當滿足(1)時,為最小堆,當滿足(2)時,為最大堆。

若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i+1個節點分別是節點i的左右子節點。

如下為乙個最大堆:

下面以最小堆為例說明堆的輸出:

圖1為乙個最小堆,當最小節點根節點13輸出後,將最後乙個節點97作為根節點,移到頂端,如圖2. 然後要對堆進行調整。比較此完全樹的根節點與其兩個子節點大小,因為27 < 38 < 97,所以27是三個節點裡最小的,將節點27與根節點97交換。此時以97替代27而產生的右子樹為乙個新的堆,再以97為根節點,對此最小堆進行調整,同理,知道要將97與49交換,得到圖3的完全樹。此時以97代替49為根節點的右子樹為乙個新堆,再對此堆做同樣的操作,因為此完全樹已經是最小堆,所以可以停止操作,堆的調整完畢。此時再將根節點,對的最小值輸出,並進行同樣的調整,可以得到如圖4的新堆。這個過程被稱為「篩選」。

同樣以最小堆說明堆的初始化:

從乙個無序序列初始化為乙個堆的過程就是乙個反覆「篩選」的過程。由完全二叉樹的性質可以知,乙個有n個節點的完全二叉樹的最後乙個非葉節點是節點[n/2],堆的初始化過程就從這個[n/2]節點開始。上圖為如下無序陣列的初始化:

首先,未處理的陣列對應的堆為圖1模樣。從第四個節點開始([8/2]=4),因為50 < 97,故要交換兩節點,交換後還要繼續對其新的左子樹進行類似輸出後那樣的篩選。易見其左子樹只有節點97,已經為最佳情況,故可以繼續堆的初始化,如圖2。再考慮第三個節點,因為13 < 27 < 65,即節點13為當前的最小節點,故與節點65交換,並對新的左子樹進行篩選,其也為最佳情況,故可繼續堆的初始化,結果如圖3。然後考慮第二個節點,因為38 < 50 < 76,故已經為最優情況,不用調整。最後再考慮第乙個節點,根節點。因為 13

堆的定義是:n個元素的序列,當且僅當滿足如下關係時被成為堆

(1)ki

<= k2i 且 ki

<= k2i-1

或 (2) ki >= k2i 且 ki >= k2i-1 

(i = 1,2,…[n/2])

當滿足(1)時,為最小堆,當滿足(2)時,為最大堆。

若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i+1個節點分別是節點i的左右子節點。

如下為乙個最大堆:

下面以最小堆為例說明堆的輸出:

圖1為乙個最小堆,當最小節點根節點13輸出後,將最後乙個節點97作為根節點,移到頂端,如圖2. 然後要對堆進行調整。比較此完全樹的根節點與其兩個子節點大小,因為27 < 38 < 97,所以27是三個節點裡最小的,將節點27與根節點97交換。此時以97替代27而產生的右子樹為乙個新的堆,再以97為根節點,對此最小堆進行調整,同理,知道要將97與49交換,得到圖3的完全樹。此時以97代替49為根節點的右子樹為乙個新堆,再對此堆做同樣的操作,因為此完全樹已經是最小堆,所以可以停止操作,堆的調整完畢。此時再將根節點,對的最小值輸出,並進行同樣的調整,可以得到如圖4的新堆。這個過程被稱為「篩選」。

同樣以最小堆說明堆的初始化:

從乙個無序序列初始化為乙個堆的過程就是乙個反覆「篩選」的過程。由完全二叉樹的性質可以知,乙個有n個節點的完全二叉樹的最後乙個非葉節點是節點[n/2],堆的初始化過程就從這個[n/2]節點開始。上圖為如下無序陣列的初始化:

首先,未處理的陣列對應的堆為圖1模樣。從第四個節點開始([8/2]=4),因為50 < 97,故要交換兩節點,交換後還要繼續對其新的左子樹進行類似輸出後那樣的篩選。易見其左子樹只有節點97,已經為最佳情況,故可以繼續堆的初始化,如圖2。再考慮第三個節點,因為13 < 27 < 65,即節點13為當前的最小節點,故與節點65交換,並對新的左子樹進行篩選,其也為最佳情況,故可繼續堆的初始化,結果如圖3。然後考慮第二個節點,因為38 < 50 < 76,故已經為最優情況,不用調整。最後再考慮第乙個節點,根節點。因為 13

最大堆 最小堆 堆排序

最 大 小堆的性質 1 是一顆完全二叉樹,遵循完全二叉樹的所有性質。2 父節點的鍵值 大於 小於等於子節點的鍵值 3 在堆排序中我們通常用的是最大堆,最小堆通常用在優先佇列中 尚未找到恰當的例子 堆排序 陣列 a 10 可以利用建堆的方式對其進行排序。因為堆是一顆完全二叉樹,根據完全二叉樹的性質可以...

最小堆的建立及堆排序

堆的建立 堆在很多方面都有運用,這裡寫一下將乙個完全二叉樹用一維陣列儲存後再轉化為乙個最小堆 如下 假如樹中的資料都為整數 include int a 50 int n void swap int p,int q void siftdown int i if t i else flag 1 父結點小...

堆的操作和堆排序 最小堆實現遞減排序 C

include include includeusing namespace std 參考 void heapfixdown int a,int i,int n 從第i個位置開始調整堆,從上向下 a i temp void heapdeletenumber int a,int n 在最小堆中刪除數,...