#
encoding:utf-8
#[遞迴] - 單條路 自下往上排序
defheap_adjust(data, s, m):if2
*s >
m:return
#宣告 預設父節點位置
temp =s
-1#[左]子節點值 大於 父節點值 : 預設父節點位置 為 左子節點位置
ifdata[2*
s -1]
>
data[temp]: temp =2
*s-1
#[右]子節點值 大於 預設父節點 : 預設父節點位置 為 右子節點位置if2
*s <=m -
1and
data[2*
s] >
data[temp]: temp =2
*s#交換值 滿足 堆特性 此為 [ 父節點 小於 子節點 ]
iftemp
<>s -
1:data[s -1
], data[temp]
=data[temp], data[s -1
]heap_adjust(data, temp +1
, m)
defheap_sort(data):m =
len(data) /2
#構建 堆樹
#測試資料 [3,2,1] 陣列值為 所以非底層葉節點
fori
inrange(m , 0, -1
):heap_adjust(data, i, len(data))
#從堆樹中 [出棧] 排序輸出
#測試資料 [5, 4, 3, 2]
data[0], data[-1
] =data[-1
], data[0]
forn
inrange(len(data) -1
, 1, -
1):heap_adjust(data,
1, n)
data[0], data[n -1
] =data[n-1
], data[0]
data=[
2,3,
6,3,
868,9,
8,-1
]heap_sort(data)
data
#[-1, 2, 3, 3, 6, 8, 9, 868]
** 【】
堆儲存堆 入棧 複雜度為ο(logn)
堆 出棧 ο(logn)
跟我一起學 演算法導論 分治演算法
演算法導論,一章二小節 分治演算法 defmerge a,p,q,r print s s s s p,q 1 q 1,r 1 if p q l a p 10 10 else l a p q 1 10 10 if q 1 r r a r 10 10 else r a q 1 r 1 10 10 i j...
跟我一起學 演算法導論 函式的增長
3.1 漸近號 漸近範圍 f n g n a b 漸近上界 f n g n a b 0 f n cg n 漸近下界 f n g n a b 0 cg n f n 非漸近上界 f n o g n alim n f n g n 0 非漸近下界 f n g n a b 0 cg n lim n f n g...
跟我一起學 演算法導論 插入排序
演算法導論 演算法入門 一小節 插入排序,複雜度 插入排序 複雜度 definsertion sort arr 1 forj inxrange 1,len arr n 1 key arr j n 1i j 1 n 1while i 0 and arr i key n n 1 2 arr i 1 ar...