算法與資料結構基礎
原文連結:
http://note.youdao.com/noteshare?id=7b9757930ce3cc9e0a5e61e4d0aa9ea2⊂=2726FFA02ADE4E74A302D8DA7646FB46查找算法:
二分查找法:
簡介:二分查找法又被稱為折半查找法,用于預排序的查找問題
過程:
- 如果在清單a中查找元素t,先将清單a中間位置的項與查找關鍵字t比較,如果兩者相等,則成功。
- 否則,将表分為前後兩個子表
- 如果中間位置大于t,則進一步查找前一子表,否則,查找後一子表
- 重複上述過程
優劣:
- 時間複雜度為O(log~2~N),比較快
- 缺點就是必須是有序清單
排序算法:
冒泡排序
簡介:兩兩比較大小,如果不滿足升序關系,則交換
過程:略
優劣::
- 時間複雜度為O(N^2^),速度較慢
- 穩定
選擇排序
簡介:找出最小值,然後放入一個新的清單中
插入排序法
簡介:依次檢查需要排序的清單,每次取出一個元素放入另一個排好序的清單中的适當位置。
- 時間複雜度為O(N^2^)
- 速度不穩定,最佳情況為線性增長,最差情況為N^2^,是以速度實際上比前兩種快
歸并排序
簡介:分而制之的思想
- 将包含N個元素的清單分為兩個含N/2元素的子清單.
- 對兩個子清單遞歸調用歸并排序(最後将兩個子清單分解為N個子清單)。
- 合并已排序好的清單。
優劣::速度較快且穩定,時間複雜度為O(Nlog~2~N)
實作代碼:
def merge(left,right):
merged = []
i,j = 0,0
left_len,right_len = len(left),len(right)
while i<left_len and j<right_len:
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
merged.extend(left[i:])
merged.extend(right[j:])
return merged
def mergeSort(a):
if len(a) <= 1:
return a
else:
mid = len(a) // 2
left = mergeSort(a[:mid])
right = mergeSort(a[mid:])
merge(left,right)
return merge(left,right)
def main():
a = [59,12,77,64,72,69,46,89,31,9]
a1 = mergeSort(a)
print(a1)
if __name__ == '__main__':
main()
快速排序 #:
簡介:對冒泡排序的改進
- 設定兩個變量i和j,作為清單首末兩端的下标,即i=0,j=N-1
- 設定清單的第一個元素作為關鍵資料,即key=A[0]
- 從j開始向前搜尋,找到第一個小于key的值A[j],将A[j]和A[i]互換
- 從i開始向後搜尋,找到第一個大于key的值A[i],将A[i]和A[j]互換
- 重複3~4步,直到i = j
- 平均情況時間複雜度為O(Nlog~2~N),比較快。
- 最差情況下時間複雜度為O(N^2^)
Python語言中提供的排序算法
内置資料類型list的方法sort(),内置函數sorted()
這個的底層實作就是歸并排序,隻是使用了Python無法編寫的底層實作,進而避免了Python本身附加的大量開銷,速度比我們自己寫的歸并排序要快很多(10~20倍),是以說我們一般排序都盡量使用sorted和sort