搜尋歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。
將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
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...