排序6 堆排序

2021-10-07 09:17:42 字數 1883 閱讀 6437

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