跟我一起學 演算法導論 堆

2021-09-22 11:01:04 字數 1323 閱讀 2735

#

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)

print

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