然後使用快速排序使用了分而治之(divide and conquer,d&c)的思想
主要思想就是把乙個無序陣列分為3個部分:遞迴的思想重複以上步驟
參考演算法**給出的**
#quicksort
def quick_sort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
less = [i for i in arr[1:] if i <= pivot]
greater = [i for i in arr[1:] if i > pivot]
return quicksort(less)+[pivot]+quicksort(greater)
if __name__ == '__main__':
test = [49, 38, 65, 97, 76, 13, 27, 49]
print(quick_sort(test))
中間使用了兩次迴圈,雖然在時間複雜度上沒有任何變化,但實際時間不如使用一次迴圈
#quicksort
def quicksort(arr):
if len(arr) < 2:
return arr
else:
less =
greater =
pivot = arr[0]
for i in arr[1:]:
if i <= pivot:
else:
return quicksort(less)+[pivot]+quicksort(greater)
if __name__ == '__main__':
test = [49, 38, 65, 97, 76, 13, 27, 49]
print(quicksort(test))
在平均情況下,快速排序的時間複雜度為o(nlogn)
最壞情況下,快速排序的時間複雜度為o(n^2)
至於為什麼有的時候複雜度為o(nlogn),有的時候複雜度為o(n^2)?這和選擇的基準值,即pivot有關。
最壞的情況下會遞迴n次,即呼叫棧(call stack)的高度為n
而平均情況下,會遞迴logn次,即呼叫棧的高度為logn
還有一種排序演算法的時間複雜度總是o(nlogn),這種排序演算法即為合併排序
既然如此,為什麼我們經常使用快速排序,而不使用合併排序?
下節在合併排序中一起講解。
Python3 資料結構之遞迴
遞迴 def fact x if x 1 return 1 else return x fact x 1 tail recursion 尾遞迴 def tail recusion x,total 1 if x 1 return total else return tail recusion x 1,...
Python3 資料結構
python中列表是可變的,這是它區別於字串和元組的最重要的特點,一句話概括即 列表可以修改,而字串和元組不能。列表的基本特點 操作 描述把乙個元素新增到列表的結尾,相當於 a len a x list.extend l 在列表末尾新增多個物件,引數可謂迭代物件相當於 a len a l list....
Python3 資料結構之希爾排序
希爾排序 shell sort 演算法描述 step1 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序。step2 依次縮減增量再進行排序。step3 待整個序列中的元素基本有序 增量足夠小 時,再對全體元素進行一次直接插入排序。演算法結束。因為直接插入...