經典排序演算法 - 堆排序Heap sort
阿新 • • 發佈:2018-11-28
經典排序演算法 - 堆排序Heap sort
堆排序有點小複雜,分成三塊
第一塊,什麼是堆,什麼是最大堆
第二塊,怎麼將堆調整為最大堆,這部分是重點
第三塊,堆排序介紹
第一塊,什麼是堆,什麼是最大堆
什麼是堆
這裡的堆(二叉堆),指得不是堆疊的那個堆,而是一種資料結構。
堆可以視為一棵完全的二叉樹,完全二叉樹的一個“優秀”的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每一個結點對應陣列中的一個元素.
陣列與堆之間的關係
二叉堆一般分為兩種:最大堆和最小堆。
什麼是最大堆
堆中每個父節點的元素值都大於等於
因此,最大堆中的最大元素值出現在根結點(堆頂)
節點與陣列索引關係
對於給定的某個結點的下標i,可以很容易的計算出這個結點的父結點、孩子結點的下標,而且計算公式很漂亮很簡約
第二塊,怎麼將堆調整為最大堆,這部分是重點
整個過程如下圖所示
在4,14,7這個小堆裡邊,父節點4小於左孩子14,所以兩者交換
在4,2,8這個小堆裡邊,父節點4小於右孩子8,所以兩者交換
上圖展示了一趟調整的過程,這個過程遞迴實現,直到調整為最大堆為止
第三塊,堆排序介紹
堆排序就是把堆頂的最大數取出,
將剩餘的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞迴實現
剩餘部分調整為最大堆後,再次將堆頂的最大數取出,再將剩餘部分調整為最大堆,這個過程持續到剩餘數只有一個時結束
下邊三張圖詳細描述了整個過程