歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。
將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
# 二分分解
num =
len(alist)/2
left = merge_sort(alist[
:num]
) right = merge_sort(alist[num:])
# 合併
return merge(left,right)
defmerge
(left, right)
:'''合併操作,將兩個有序陣列left和right合併成乙個大的有序陣列'''
#left與right的下標指標
l, r =0,
0 result =
while l<
len(left)
and r<
len(right)
:if left[l]
< right[r]:)
l +=
1else:)
r +=
1 result += left[l:
] result += right[r:
]return result
最優時間複雜度:o(nlogn)
最壞時間複雜度:o(nlogn)
穩定性:穩定
搜尋是在乙個專案集合中找到乙個特定專案的演算法過程。搜尋通常的答案是真的或假的,因為該專案是否存在。 搜尋的幾種常見方法:順序查詢、二分法查詢、二叉樹查詢、雜湊查詢。
二分查詢又稱折半查詢
優點:比較次數少,查詢速度快,平均效能好
缺點:要求待查表為有序表,且插入刪除困難。
①非遞迴實現
def
binary_search
(alist, item)
: first =
0 last =
len(alist)-1
while first<=last:
midpoint =
(first + last)/2
if alist[midpoint]
== item:
return
true
elif item < alist[midpoint]
: last = midpoint-
1else
: first = midpoint+
1return
false
testlist =[0
,1,2
,8,13
,17,19
,32,42
,]print
(binary_search(testlist,3)
)print
(binary_search(testlist,13)
)
②遞迴實現
def
binary_search
(alist, item):if
len(alist)==0
:return
false
else
: midpoint =
len(alist)//2
if alist[midpoint]
==item:
return
true
else
:if item
:return binary_search(alist[
:midpoint]
,item)
else
:return binary_search(alist[midpoint+1:
],item)
testlist =[0
,1,2
,8,13
,17,19
,32,42
,]print
(binary_search(testlist,3)
)print
(binary_search(testlist,13)
)
最優時間複雜度:o(1)
最壞時間複雜度:o(logn)
資料結構與演算法(歸併排序,二分查詢)
歸併排序 先遞迴分解陣列,再合併陣列。def merge sort alist if len alist 1 return alist 二分分解 num len alist 2 left merge sort alist num right merge sort alist num 合併 retur...
二分歸併排序 分治演算法與歸併排序
距離上次寫快排演算法的文章已經過去乙個半月了,和本文要提到的歸併排序演算法類似,快排也是分治思想的一種典型應用,如果有不熟悉快速排序的同學可以翻閱我之前寫過的的快速排序演算法的文章。首先為大家介紹一下什麼是分治,分治是將乙個大問題分割成若干個和原來問題形式相同但規模更小的子問題,然後處理這些小問題,...
二分歸併排序演算法 排序演算法之歸併排序
一 分治模式 許多有用的演算法在結構上是遞迴的 為了解決乙個給定的問題,演算法一次或多次遞迴地呼叫其自身以解決緊密相關的若干子問題。這些演算法典型地遵循分治法的思想 將原問題分解為幾個規模較小但類似於原問題的子問題。遞迴的求解這些問題,然後再合併這些子問題的解來建立原問題的解。分治模式在每層遞迴都有...