快速排序Python實現


算法導論上的快速排序采用分治算法,步驟如下:

1.選取一個數字作為基准,可選取末位數字

2.將數列第一位開始,依次與此數字比較,如果小於此數,將小數交換到左邊,最后達到小於基准數的在左邊,大於基准數的在右邊,分為兩個數組

3.分別對兩個數組重復上述步驟

其中一次排序步驟如下:

 

偽碼實現:

QuickSort(A,p,r)
    if p<r
        then q = Partition(A,p,r)
            QucikSort(A,p,q-1)
            QucikSort(A,q+1,r)
 
Partition(A,p,r)
    x=A[r]
    i=p-1
    for j from p to r-1
        if A[j]<=x
            then i=i+1
                exchange A[i],A[j]
    exchange A[i+1],A[r]
    return i+1

  

Python實現代碼如下:(也可看github:點我

# 記錄快排程序
def QuickSort(arr, firstIndex, lastIndex):
    if firstIndex < lastIndex:  # 終止條件
        divIndex = Partition(arr, firstIndex, lastIndex)

        QuickSort(arr, firstIndex, divIndex)  # 遞歸調用前半部分
        QuickSort(arr, divIndex+1, lastIndex)  # 遞歸調用后半部分
    else:
        return


def Partition(arr, firstIndex, lastIndex):
    i = firstIndex - 1
    for j in range(firstIndex, lastIndex):
        if arr[j] <= arr[lastIndex]:
            i = i+1  # i記錄前面有幾個數比lastIndex的小,第一次執行Partition函數可讓以arr[lastIndex]為中間值來分成兩部分
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[lastIndex] = arr[lastIndex], arr[i+1]  # 將arr[lastIndex]的數據放在該放的地方,此時可保證前后兩部分對arr[i+1]來說相對有序
    return i


if __name__ == '__main__':
    arr = [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0]
    print("initial array: \n", arr)
    QuickSort(arr, 0, len(arr)-1)
    print("result array: \n", arr)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM