6.1概念以及分類
6.1.1樹(學堆需要的基礎)
度的概念:出度(樹中乙個數字下面的數如:上圖2的出度為4,4的出度為0),入度(上乙個數)
二叉樹:整個樹中最多有兩個分叉(出度)
子節點,父節點:2,3是1的孩子節點分別為左孩子,右孩子。1是2,3的父節點(或雙親節點),2是4,5的父節點。
葉子結點:4,5,6,8出度為0成為葉子結點
6.1.2堆
大根堆:父節點均大於子節點
小根堆:父節點均小於子節點
例1:線性1 2 3 4 5 6 7 8畫成樹,數字從左向右,從上到下安排到各個樹的節點,如下圖,為小根堆
6.2堆排序原理
設原資料:
化為樹
如果是公升序排序,調整為大根堆:從最後一層二叉樹往上
①最後一層二叉樹調整:(紅色小字型為下標)
在大根堆中最大值就是樹根
② 最後一層和倒數第二層調整(內部一次調整是從上往下交換父節點小於子節點的數字:1和21交換再1和6交換):
注意:①除了第一次調整為大根堆比較慢,後面調整為大根堆都很快,速度為logn
②下標為i數字的左孩子,右孩子下標分別為:2i+1,2i+2;子節點下標為i,則其父節點為(i-1)/2,整除
3.3根排序**
//二叉樹調整為大根堆
//start起始下標,end結束下標
void
heapadjust
(int
*arr,
int start,
int end)
//時間複雜度/o(logn)
//i是左右孩子較大值下標
if(arr[i]
>tmp)
else
par=i;
} arr[par]
=tmp;
}//堆排序
void
heapsort
(int
*arr,
int len)
//每次將根和待排序最後的值交換,然後調整
for(
int i=
0;i1;i++
)}
6.4評價
①不穩定,因為是父子節點交換資料,父子下標沒有挨著,屬於跳躍交換
②時間複雜度o(nlogn),空間複雜度o(1)
排序演算法6 堆排序
堆排序可以看作是簡單選擇排序的一種的改進方法,平均複雜度為 o n log n 因此應用場合較多。其原理同簡單選擇排序相似 將資料分為已排序和未排序的兩部分,並且不斷的從未排序資料中選取最大 或最小 資料加入到已排序集合中。不同之處在於,堆排序採用了一種特殊的二叉堆結構來快速的尋找最大值。如下圖,首...
排序演算法 6 堆排序
堆通常是可以被看成一顆完全二叉樹的陣列。堆滿足如下特質 1.堆是一顆完全二叉樹。2.堆中某個節點的置總是大於等於父節點的值,或小於等於父節點的值。按照堆的特點,可以把堆分為大頂堆和小頂堆。大頂堆 每個節點的值都小於等於其父節點的值。小頂堆 每個節點的值都大於等於其父節點的值。將集合資料進行排序可以使...
演算法導論 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...