Python3&資料結構之快速排序
阿新 • • 發佈:2018-12-05
然後使用快速排序使用了分而治之(divide and conquer,D&C)的思想
主要思想就是把一個無序陣列分為3個部分:遞迴的思想重複以上步驟
- 中心點(pivot):該點是隨機選的,一般選陣列中索引為0,即第一個數當中心點
- 左邊(less):小於等於中心點的陣列成的陣列
- 右邊(greater):大於中心點的陣列成的陣列
參考演算法圖解給出的程式碼
#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: less.append(i) else: greater.append(i) 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),這種排序演算法即為合併排序
既然如此,為什麼我們經常使用快速排序,而不使用合併排序?
下節在合併排序中一起講解。