1. 程式人生 > >經典排序演算法 - 堆排序Heap sort

經典排序演算法 - 堆排序Heap sort

經典排序演算法 - 堆排序Heap sort

堆排序有點小複雜,分成三塊

第一塊,什麼是堆,什麼是最大堆

第二塊,怎麼將堆調整為最大堆,這部分是重點

第三塊,堆排序介紹


第一塊,什麼是堆,什麼是最大堆

什麼是堆

這裡的堆(二叉堆),指得不是堆疊的那個堆,而是一種資料結構。

堆可以視為一棵完全的二叉樹,完全二叉樹的一個“優秀”的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每一個結點對應陣列中的一個元素.

陣列與堆之間的關係

Heap1

二叉堆一般分為兩種:最大堆和最小堆。

什麼是最大堆

堆中每個父節點的元素值都大於等於

其孩子結點(如果存在),這樣的堆就是一個最大堆

因此,最大堆中的最大元素值出現在根結點(堆頂)

節點與陣列索引關係

對於給定的某個結點的下標i,可以很容易的計算出這個結點的父結點、孩子結點的下標,而且計算公式很漂亮很簡約

Image(2)

第二塊,怎麼將堆調整為最大堆,這部分是重點

整個過程如下圖所示

在4,14,7這個小堆裡邊,父節點4小於左孩子14,所以兩者交換

在4,2,8這個小堆裡邊,父節點4小於右孩子8,所以兩者交換

Heap3

上圖展示了一趟調整的過程,這個過程遞迴實現,直到調整為最大堆為止

第三塊,堆排序介紹

堆排序就是把堆頂的最大數取出,

將剩餘的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞迴實現

剩餘部分調整為最大堆後,再次將堆頂的最大數取出,再將剩餘部分調整為最大堆,這個過程持續到剩餘數只有一個時結束

下邊三張圖詳細描述了整個過程

Heap4

Heap5

Heap6