1. 程式人生 > >Python3&資料結構之快速排序

Python3&資料結構之快速排序

然後使用快速排序使用了分而治之(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),這種排序演算法即為合併排序

既然如此,為什麼我們經常使用快速排序,而不使用合併排序?

下節在合併排序中一起講解。