排序演算法 6 堆排序

2021-10-25 15:53:22 字數 959 閱讀 4383

堆通常是可以被看成一顆完全二叉樹的陣列。堆滿足如下特質: 1. 堆是一顆完全二叉樹。 2. 堆中某個節點的置總是大於等於父節點的值,或小於等於父節點的值。 

按照堆的特點,可以把堆分為大頂堆和小頂堆。

大頂堆:每個節點的值都小於等於其父節點的值。

小頂堆: 每個節點的值都大於等於其父節點的值。

將集合資料進行排序可以使用堆排序。 一般公升序排列,採用大頂堆實現。降序排列使用小頂堆實現。以公升序排序為例,如何將乙個無序的集合資料公升序排列呢? 首先將集合資料使用篩選法構造成乙個大頂堆,取下根節點作為最大元素,放在集合末尾。將剩下的資料繼續構造成大頂堆結構,得到次大資料。依此類推,使整個集合資料有序。

堆排序時間複雜度o(nlog n)。效能也比希爾排序更好。根據堆排序原理,每經過一次堆排序,得到乙個最大數,放到集合末尾,直到集合資料有序。**實現如下:

/*

* 功能說明

* 構造大頂堆

*@引數 int * array <#待排序陣列#>

*@引數 int idx <#待篩選節點下標#>

*@引數 int len <#待排序陣列長度#>

*@返回值 <#void#>

*/void buildmaxheap(int * array,int idx,int len)

if(array[idx] < array[childidx])else

}}/*

* 功能說明

* 堆排序

*@引數 int * array <#待排序陣列#>

*@引數 int len <#待排序陣列長度#>

*@返回值 <#void#>

*/void heapsort(int * array, int len)

for(i = len - 1 ; i > 0 ; --i)

}

這一把沒有什麼總結的,等到排序演算法更新完後,一起總結。

排序演算法6 堆排序

堆排序可以看作是簡單選擇排序的一種的改進方法,平均複雜度為 o n log n 因此應用場合較多。其原理同簡單選擇排序相似 將資料分為已排序和未排序的兩部分,並且不斷的從未排序資料中選取最大 或最小 資料加入到已排序集合中。不同之處在於,堆排序採用了一種特殊的二叉堆結構來快速的尋找最大值。如下圖,首...

排序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...