歸併排序:先遞迴分解陣列,再合併陣列。
def
merge_sort
(alist):if
len(alist)
<=1:
return alist
# 二分分解
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
alist =[54
,26,93
,17,77
,31,44
,55,20
]sorted_alist = mergesort(alist)
print
(sorted_alist)
最優時間複雜度:o(nlogn)
最壞時間複雜度:o(nlogn)
穩定性:穩定
二分查詢:前提需要是有序表
#非遞迴實現
defbinary_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)
)#遞迴實現
defbinary_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)
資料演算法與結構 歸併排序 二分查詢
歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。二分分解 num l...
二分歸併排序 分治演算法與歸併排序
距離上次寫快排演算法的文章已經過去乙個半月了,和本文要提到的歸併排序演算法類似,快排也是分治思想的一種典型應用,如果有不熟悉快速排序的同學可以翻閱我之前寫過的的快速排序演算法的文章。首先為大家介紹一下什麼是分治,分治是將乙個大問題分割成若干個和原來問題形式相同但規模更小的子問題,然後處理這些小問題,...
二分歸併排序演算法 排序演算法之歸併排序
一 分治模式 許多有用的演算法在結構上是遞迴的 為了解決乙個給定的問題,演算法一次或多次遞迴地呼叫其自身以解決緊密相關的若干子問題。這些演算法典型地遵循分治法的思想 將原問題分解為幾個規模較小但類似於原問題的子問題。遞迴的求解這些問題,然後再合併這些子問題的解來建立原問題的解。分治模式在每層遞迴都有...