算法導論上的快速排序采用分治算法,步驟如下:
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)
