Python3 資料結構之快速排序

2021-09-02 06:38:40 字數 1268 閱讀 3013

然後使用快速排序使用了分而治之(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 待整個序列中的元素基本有序 增量足夠小 時,再對全體元素進行一次直接插入排序。演算法結束。因為直接插入...