排序演算法6 堆排序

2021-07-27 04:19:49 字數 1073 閱讀 2786

堆排序可以看作是簡單選擇排序的一種的改進方法,平均複雜度為 \(o(n\log n)\),因此應用場合較多。

原理同簡單選擇排序相似:將資料分為已排序和未排序的兩部分,並且不斷的從未排序資料中選取最大(或最小)資料加入到已排序集合中。不同之處在於,堆排序採用了一種特殊的二叉堆結構來快速的尋找最大值。(如下圖,首先建立二叉堆,然後進行選擇排序)

二叉堆是完全二叉樹或者近似完全二叉樹結構。

二叉堆有兩種:

最小堆:父結點的鍵值總是小於或等於任何乙個子節點的鍵值。

最大堆:父結點的鍵值總是大於或等於任何乙個子節點的鍵值;

二叉堆的儲存可以採用陣列形式,如下圖:

二叉堆的建立流程如下:(最大堆)

以上面的最大堆為例,儘管其陣列表示形式不一定是排好序的,但我們總能保證根節點的資料是最大值。

於是,二叉堆的核心:每次取走最大值用於選擇排序,重排剩下的堆保證其仍為最大堆。

二叉堆取值重排策略:(最大堆)

堆排序不是穩定排序,平均複雜度為 \(o(n\log n)\),雖然堆排序在很多機器上沒有快速排序高效,但是堆排序在最差情況下的執行時間要優於快排。

排序演算法 6 堆排序

堆通常是可以被看成一顆完全二叉樹的陣列。堆滿足如下特質 1.堆是一顆完全二叉樹。2.堆中某個節點的置總是大於等於父節點的值,或小於等於父節點的值。按照堆的特點,可以把堆分為大頂堆和小頂堆。大頂堆 每個節點的值都小於等於其父節點的值。小頂堆 每個節點的值都大於等於其父節點的值。將集合資料進行排序可以使...

排序6 堆排序

6.1概念以及分類 6.1.1樹 學堆需要的基礎 度的概念 出度 樹中乙個數字下面的數如 上圖2的出度為4,4的出度為0 入度 上乙個數 二叉樹 整個樹中最多有兩個分叉 出度 子節點,父節點 2,3是1的孩子節點分別為左孩子,右孩子。1是2,3的父節點 或雙親節點 2是4,5的父節點。葉子結點 4,...

演算法導論 6 堆排序

堆的分類 最大堆性質 高度 對於堆的一些基本操作 偽 描述 實現 max heapify python實現 123 4567 891011 1213 def max heapify i print max heapify i l left i r right i if l heap size and...