經典排序演算法 - 堆排序heap sort
堆排序有點小複雜,分成三塊
第一塊,什麼是堆,什麼是最大堆
第二塊,怎麼將堆調整為最大堆,這部分是重點
第三塊,堆排序介紹
第一塊,什麼是堆,什麼是最大堆
什麼是堆
這裡的堆(二叉堆),指得不是堆疊的那個堆,而是一種資料結構。
堆可以視為一棵完全的二叉樹,完全二叉樹的乙個「優秀」的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個結點對應陣列中的乙個元素.
陣列與堆之間的關係
二叉堆一般分為兩種:最大堆和最小堆。
什麼是最大堆
堆中每個父節點的元素值都大於等於其孩子結點(如果存在),這樣的堆就是乙個最大堆
因此,最大堆中的最大元素值出現在根結點(堆頂)
節點與陣列索引關係
對於給定的某個結點的下標i,可以很容易的計算出這個結點的父結點、孩子結點的下標,而且計算公式很漂亮很簡約
第二塊,怎麼將堆調整為最大堆,這部分是重點
整個過程如下圖所示
在4,14,7這個小堆裡邊,父節點4小於左孩子14,所以兩者交換
在4,2,8這個小堆裡邊,父節點4小於右孩子8,所以兩者交換
上圖展示了一趟調整的過程,這個過程遞迴實現,直到調整為最大堆為止
第三塊,堆排序介紹
堆排序就是把堆頂的最大數取出,
將剩餘的堆繼續調整為最大堆,具體過程在第二塊有介紹,以遞迴實現
剩餘部分調整為最大堆後,再次將堆頂的最大數取出,再將剩餘部分調整為最大堆,這個過程持續到剩餘數只有乙個時結束
下邊三張圖詳細描述了整個過程
參考文章
經典演算法 堆排序
堆排序是利用堆的性質來進行排序的乙個演算法。一 堆堆 英語 heap 是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆 斐波那契堆等。堆的定義如下 n個元素的序列當...
經典排序演算法 堆排序(Heap Sort)
首先堆是乙個完全二叉樹,但同時他具有這樣的要求 每乙個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 每乙個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖是乙個大頂堆 在此要補充乙個二叉樹的性質 二叉樹的某個節點下標為i,則它的左孩子的下標一定為2i,右孩子下標一定為2i 1。假如現...
經典排序演算法 堆排序Heap sort
經典排序演算法 堆排序heap sort 堆排序有點小複雜,分成三塊 第一塊,什麼是堆,什麼是最大堆 第二塊,怎麼將堆調整為最大堆,這部分是重點 第三塊,堆排序介紹 第一塊,什麼是堆,什麼是最大堆 什麼是堆 這裡的堆 二叉堆 指得不是堆疊的那個堆,而是一種資料結構。堆可以視為一棵完全的二叉樹,完全二...