排序之堆排序

2021-09-25 04:20:16 字數 1548 閱讀 5446

堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點

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

排序之堆排序

利用堆這種資料結構進行排序的一種演算法,它是選擇排序的一種。我們可以把堆看成一棵完全二叉樹,這棵完全二叉樹滿足 大堆 每個節點的值大於等於孩子節點的堆 小堆 每個節點的值小於等於孩子節點的堆 代表堆的完全二叉樹的根結點的值是最值的,也是陣列的第乙個元素,將乙個無序序列調整為乙個堆,就可以找出這個序列...