1. 程式人生 > >Python實現快速排序演算法

Python實現快速排序演算法

快速排序也是使用了分治思想的排序方法,但與歸併排序不一樣的是“分”的時候的依據。歸併排序“分”的依據是對半分,不管大小,而快速排序則是選定陣列中的一個值,以這個值為依據,將陣列分為三個部分:小於這個值的部分,大於等於這個值的部分,這個值。這樣就以選定的點將陣列分為兩部分(小於值的部分,大於等於值的部分),然後再通過迭代對這兩個部分分別繼續執行這樣一個“分”的過程,直至最後只剩下1-2個元素,即無法再“分”時,此時陣列也排序完成。 下面以圖示的方法展示一下第一次“分”的過程。 首先給出要排序的陣列l=[2,8,7,1,3,5,6,4]l=[2,8,7,1,3,5,6,4]

,5,6,4]stastaendend分別為陣列的首尾下標。利用iijj這兩個數進行迭代。令i=sta1,j=stai=sta-1,j=sta在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 迭代過程中分成了這樣幾個部分: 在這裡插入圖片描述 ii所在的位置是<end<end的最新的一個值,在“分”的最後,將返回i+1i+1,即用來比較的值的位置,以供下次迭代。 具體的python程式碼實現如下。

#將陣列分為兩部分
def partition(l0,sta,end):
    i=sta-1
    for j in range(sta,end):
        if l0[j]<l0[end]:
            i=i+1
            #如果j所在的位置的值小於end,則i往前進一步,並與j的值交換,即將一個新的值加入到<end的區域
            x=l0[i]
            l0[i]=l0[j]
            l0[j]=x
    #一次“分”結束,將用於比較的值放在應該在的地方(兩個區域的中間)
    i=i+1
    x=l0[i]
    l0[i]=l0[end]
    l0[end]=x
    return i
    
def quicksort(l0,sta,end):
    #當至少存在兩個元素時,才進行接下來的分解
    if sta<end:
        mid=partition(l0,sta,end)
        #分成的sta—mid-1,mid+1—end兩個區域接著進行分解、迭代
        quicksort(l0,sta,mid-1)
        quicksort(l0,mid+1,end)
    return l0

快速排序的最壞情況,即每次分解時都極其不平衡,分解為n1n-1個元素和00個元素,這樣分解操作的時間複雜度為Θ(n)Θ(n),而對大小為00的陣列進行迭代會直接返回,時間複雜度可以忽略。這樣演算法執行時間的遞迴式為 T(n)=T(n1)+Θ(n)T(n)=T(n-1)+Θ(n) 解為T(n)=Θ(n2)T(n)=Θ(n^2) 而最好的情況則是每次都對半分,這樣算出的時間複雜度為Θ(nlgn)Θ(nlgn) 而即使是每次的劃分達到9:19:1這樣一個很不平衡的狀態,最終算出的時間複雜度也是Θ(nlgn)Θ(nlgn)

,事實上,即使是99:199:1也是這樣的時間複雜度。(結論和推導均來自《演算法導論》) 所以快速排序法的期望時間複雜度為Θ(nlgn)Θ(nlgn),是一個優秀的排序演算法。