堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點
(1):首先是進行heapify,建立堆
(2):從下到上,從右到左的進行heapify構建有序的堆
(3):進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟
1:heapify
def
heapify
(tree, n, i)
:# n為樹的長度, i為起始的父節點
if(i >= n)
:# 當i超過樹的長度時跳出迴圈
return
c1 =
2*i +
1# 左兒子
c2 =
2*i +
2# 右兒子
max= i # 當前的父節點
if(c1 < n and tree[c1]
> tree[
max]):
# 當是》時,大頂堆; 當是《時,小頂堆
max= c1
if(c2 < n and tree[c2]
> tree[
max]):
max= c2
if(max
!= i)
:# 當max和i不一樣的時候才進行調換
tree[i]
, tree[
max]
=tree[
max]
, tree[i]
heapify(tree, n,
max)
2:build_heap
def
build_heap
(tree)
: n =
len(tree)
last_node =
(n -1)
//2# 最後的乙個父節點
for i in
range
(last_node,-1
,-1)
:# 從下到上,從右到左
heapify(tree, n, i)
3:heap_sort
def
heap_sort
(tree)
: build_heap(tree)
# 對於無序的陣列先建立好大頂堆
for i in
range
(len
(tree)-1
,-1,
-1):
# 注意這裡是len(tree)-1
tree[0]
, tree[i]
= tree[i]
, tree[0]
heapify(tree, i,0)
# 注意,這裡直接就是使用i當成樹的長度
比如:3 27 36 27,
如果堆頂3先輸出,則,第三層的27(最後乙個27)跑到堆頂,然後堆穩定,繼續輸出堆頂,是剛才那個27,這樣說明後面的27先於第二個位置的27輸出,不穩定。
排序之堆排序
堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...
排序之堆排序
這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...
排序之堆排序
利用堆這種資料結構進行排序的一種演算法,它是選擇排序的一種。我們可以把堆看成一棵完全二叉樹,這棵完全二叉樹滿足 大堆 每個節點的值大於等於孩子節點的堆 小堆 每個節點的值小於等於孩子節點的堆 代表堆的完全二叉樹的根結點的值是最值的,也是陣列的第乙個元素,將乙個無序序列調整為乙個堆,就可以找出這個序列...