一、快速排序簡述
劃分
快速排序的核心就是劃分,假設一個列表 list=[2, 3, 2, 1, 4, 1],我們以列表第一個數即 list[0] 爲基準值進行劃分,小於等於基準值的數組成一個列表 low,大於基準值的數組成一個列表 high。則如下所示
low = [2, 1, 1]
high = [3, 4]
遞歸
使用遞歸解決問題,意思是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法來表示問題的解。使用遞歸時需要注意如下:
- 遞歸基,表示該問題最簡單情況的直接解;如這題,最簡單的情況爲 list 爲空或只有一個元素,這種情況都視爲有序的。
- 遞歸步,表示一般情況下如何求解問題;如這題,一般情況就是子問題,可假設一個 list=[1,4,1] ,基準值是1,劃分爲 low=[1] 和 high=[4],然後需要返回一個有序的列表 low + 基準值 + high。
- 遞歸調用,即調用自身函數或方法;假設一個 list=[1,4,2,1,0] ,基準值是1,劃分爲 low=[1,0] 和
high=[4,2],low和high都是無序的,所以還需要調用自身函數分別對low和high劃分。
二、代碼結構
劃分函數
劃分函數 partition(List) ,返回一個元組即 (low,high),
快速排序函數
快速排序函數 qsort(List)
僞代碼,僅提供思路
qsort(List):
if len(List) is 0 or 1 //遞歸基
return List
else: //遞歸步
base = List[0]
tuple = partition(List)
low = qsort(tuple[0]) //遞歸調用
high = qsort(tuple[1]) //遞歸調用
return low + base + high