python資料結構與演算法第六天

2021-10-01 06:31:00 字數 3764 閱讀 2527

搜尋歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。

將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。

def

merge_sort

(alist)

:'''歸併排序'''

n =len(alist)

if n <=1:

return alist

mid = n //

2# left採用歸併排序後形成的有序的新的列表

left_li = merge_sort(alist[

:mid]

)# right採用歸併排序後形成的有序的新的列表

right_li = merge_sort(alist[mid:])

# 將兩個有序的子串行合併為乙個新的整體

# merge(left,right)

left_pointer, right_pointer =0,

0 result =

while left_pointer <

len(left_li)

and right_pointer <

len(right_li)

:if left_li[left_pointer]

< right_li[right_pointer]:)

left_pointer +=

1else:)

right_pointer +=

1 result += left_li[left_pointer:

]#這裡需要額外注意

result += right_li[right_pointer:

]return result

if __name__ ==

'__main__'

: li =[54

,26,93

,17,77

,31,44

,55,20

]print

(li)

print

(merge_sort(li)

)

輸出為

[54,

26,93,

17,77,

31,44,

55,20]

[17,20

,26,31

,44,54

,55,77

,93]

時間複雜度

常見排序演算法效率比較

排序方法

平均情況

最好情況

最壞情況

輔助空間

穩定性氣泡排序

o(n

2n^2

n2)o(n)

o(n

2n^2

n2)o(1)

穩定選擇排序

o(n

2n^2

n2)o(n

2n^2

n2)o(n

2n^2

n2)o(1)

不穩定插入排序

o(n

2n^2

n2)o(n)

o(n

2n^2

n2)o(1)

穩定希爾排序

o(nlogn)~o(n

2n^2

n2)o(n

1.3n^

n1.3

)o(n

2n^2

n2)o(1)

不穩定堆排序

o(nlogn)

o(nlogn)

o(nlogn)

o(1)

不穩定歸併排序

o(nlogn)

o(nlogn)

o(nlogn)

o(n)

穩定快速排序

o(nlogn)

o(nlogn)

o(n

2n^2

n2)o(nlogn) ~ o(n)

不穩定搜尋是在乙個專案集合中找到乙個特定專案的演算法過程。搜尋通常的答案是真的或假的,因為該專案是否存在。搜尋的集中常見方法:順序查詢、二分法查詢、二叉樹查詢、雜湊查詢

二分法查詢

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困吶。因此,這般查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

# 遞迴版

defbinary_search

(alist, item)

:'''二分查詢'''

n =len(alist)

if n >0:

mid = n //

2if alist[mid]

== item:

return

true

elif alist[mid]

> item:

return binary_search(alist[

:mid]

, item)

else

:return binary_search(

(alist[mid +1:

]), item)

return

false

# 非遞迴版

defbinary_search_2

(alist, item)

:'''二分查詢'''

n =len(alist)

first =

0 last = n -

1while first < last:

mid =

(first + last)//2

if alist[mid]

== item:

return

true

elif alist[mid]

< item:

first = mid +

1else

: last = mid -

1return

false

if __name__ ==

'__main__'

: li =[17

,20,26

,31,44

,54,55

,77,93

]print

(binary_search(li,55)

)print

(binary_search(li,

100)

)print

(binary_search_2(li,55)

)print

(binary_search_2(li,

100)

)

輸出

true

false

true

false

時間複雜度

MOOC資料結構與演算法Python版 第六周測驗

1 單選 2分 下列哪個演算法使用到了分治策略?d 2單選 2分 函式值快取最適合使用哪種python中的資料型別?b 3 單選 2分 已知數列g x 滿足 根據遞推式寫出求數列值的遞迴演算法,問原始演算法與採用函式值快取的演算法時間複雜度分別為多少?a 4 單選 2分 博物館大盜問題中,若共有10...

資料結構與演算法 第六課

kmp模式匹配,求最大長度 位置從0開始,長度從 1開始 從哪乙個開始,就先遮掉他,看他前面第乙個元素 從頭部開始,看有幾個和前面的元素匹配 陣列的位址計算問題 首位址,陣列大小 mn t123 所求下標 ij ijk char 1 int 4 double 8 一維 a i a 0 i size ...

資料結構與演算法(六)

遞迴的應用 1.什麼是遞迴 遞迴是一種方法呼叫自己的程式設計技術。例 public class recusion 例一 public static void test 例二 public static void test2 int n system.out.println n test2 n 1 2...