漫畫:什麼是堆排序?
那麼,這個二叉堆怎樣來使用呢?我們這一期將會詳細講述。
讓我們回顧一下二叉堆和最大堆的特性:
1.二叉堆本質上是一種完全二叉樹
2.最大堆的堆頂是整個堆中的最大元素
當我們刪除一個最大堆的堆頂(並不是完全刪除,而是替換到最後面),經過自我調節,第二大的元素就會被交換上來,成為最大堆的新堆頂。
正如上圖所示,當我們刪除值為10的堆頂節點,經過調節,值為9的新節點就會頂替上來;當我們刪除值為9的堆頂節點,經過調節,值為8的新節點就會頂替上來.......
由於二叉堆的這個特性,我們每一次刪除舊堆頂,調整後的新堆頂都是大小僅次於舊堆頂的節點。那麼我們只要反覆刪除堆頂,反覆調節二叉堆,所得到的集合就成為了一個有序集合,過程如下:
到此為止,我們原本的最大堆已經變成了一個從小到大的有序集合。之前說過二叉堆實際儲存在陣列當中,陣列中的元素排列如下:
由此,我們可以歸納出堆排序演算法的步驟:
1. 把無序陣列構建成二叉堆。
2. 迴圈刪除堆頂元素,移到集合尾部,調節堆產生新的堆頂。

public class HeapSort {
二叉堆的節點下沉調整(downAdjust 方法)是堆排序演算法的基礎,這個調節操作本身的時間複雜度是多少呢?
假設二叉堆總共有n個元素,那麼下沉調整的最壞時間複雜度就等同於二叉堆的高度,也就是 O(logn) 。
我們再來回顧一下堆排序演算法的步驟:
1. 把無序陣列構建成二叉堆。
2. 迴圈刪除堆頂元素,移到集合尾部,調節堆產生新的堆頂。
第一步,把無序陣列構建成二叉堆,需要進行n/2次迴圈。每次迴圈呼叫一次 downAdjust 方法,所以第一步的計算規模是 n/2 * logn,時間複雜度 O(nlogn) 。
第二步,需要進行n-1次迴圈。每次迴圈呼叫一次 downAdjust 方法,所以第二步的計算規模是 (n-1) * logn ,時間複雜度 O(nlogn) 。
兩個步驟是並列關係,所以整體的時間複雜度同樣是 O(nlogn) 。

原文釋出時間為:2018-09-10
本文作者:小灰
本文來自雲棲社群合作伙伴“ ofollow,noindex">程式員小灰 ”,瞭解相關資訊可以關注“ 程式設計師小灰 ”。