快速排序算法使用了分治思想。分治是說如果一個比較難的問題不好解決,我們可以嘗試把它分解成若干個簡單的同類子問題,依次求解各個子問題,再將子問題的解組合起來得到原問題的解。
快排的思想是:
- 在數據集中找一個元素作為基準值 (pivot), 一般取第一個就行
- 所有比基準值小的元素放到基準值的左邊,大于等于基準值的元素放到基準值的右邊
- 對左右子集重復上面兩部操作,直到數據集為空或數據集中只剩下一個元素
如對 6, 2, 8, 3, 12, 7 進行排序
第一步以 6 作為基準值,分出左右2個子集
[2, 3] [6] [8, 12, 7]
左右子集遞歸操作
[] [2] [3] [6] [7] [8] [12]
合并結果集
2 3 6 7 8 12
def quick_sort(l):
if len(l) <= 1: # 基線條件:空數組或只有一個元素的數組本來就有序直接返回
return l
pivot = l[0] # 取第一個元素為基準值
left = [x for x in l[1:] if x < pivot] # 小于基準值的數放到左邊
right = [x for x in l[1:] if x >= pivot] # 大于等于基準值的數放到右邊
# 對左右子集遞歸調用快速排序,最后將結果集拼接
return quick_sort(left) + [pivot] + quick_sort(right)
l = [6, 2, 8, 3, 12, 7]
print(l)
l = quick_sort(l)
print(l)
遞歸必須有退出條件,這里退出條件就是空數組或只有一個元素的數組,這兩種情況我們是知道怎么排序的,它們本來就有序。
快速排序是一種不穩定的排序算法
快速排序是最快的排序算法之一,算法平均時間復雜度是 O(nlog(n)), 最壞時間復雜度是 O(n^2)