堆排序有點小複雜,分紅三塊html
第一塊,什麼是堆,什麼是最大堆數組
第二塊,怎麼將堆調整爲最大堆,這部分是重點數據結構
第三塊,堆排序介紹htm
第一塊,什麼是堆,什麼是最大堆blog
什麼是堆排序
這裏的堆(二叉堆),指得不是堆棧的那個堆,而是一種數據結構。遞歸
堆能夠視爲一棵徹底的二叉樹,徹底二叉樹的一個「優秀」的性質是,除了最底層以外,每一層都是滿的,這使得堆能夠利用數組來表示,每個結點對應數組中的一個元素.索引
數組與堆之間的關係get
二叉堆通常分爲兩種:最大堆和最小堆。it
什麼是最大堆
堆中每一個父節點的元素值都大於等於其孩子結點(若是存在),這樣的堆就是一個最大堆
所以,最大堆中的最大元素值出如今根結點(堆頂)
節點與數組索引關係
對於給定的某個結點的下標i,能夠很容易的計算出這個結點的父結點、孩子結點的下標,並且計算公式很漂亮很簡約
第二塊,怎麼將堆調整爲最大堆,這部分是重點
整個過程以下圖所示
在4,14,7這個小堆裏邊,父節點4小於左孩子14,因此二者交換
在4,2,8這個小堆裏邊,父節點4小於右孩子8,因此二者交換
上圖展現了一趟調整的過程,這個過程遞歸實現,直到調整爲最大堆爲止
第三塊,堆排序介紹
堆排序就是把堆頂的最大數取出,
將剩餘的堆繼續調整爲最大堆,具體過程在第二塊有介紹,以遞歸實現
剩餘部分調整爲最大堆後,再次將堆頂的最大數取出,再將剩餘部分調整爲最大堆,這個過程持續到剩餘數只有一個時結束
下邊三張圖詳細描述了整個過程
參考文章
http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html