基本思想
首先要找一個數作爲基準數,用於參照比較。所有比基數大的都放在基數的右邊,比基數小的都放在基數的左邊。
1. 先選擇最左端的一項作爲基準數
。
2. 分別從左端和有段選擇一項作爲哨兵i
和哨兵j
。
3. 基準數
在左,在右端的哨兵j
先動(從右向左,i從坐向右)。
4. 哨兵i
關注小於基準數
。哨兵j
關注大於基準數
。
例子代碼
a = [9, 4, 7, 3, 1, 5, 8, 6, 2]
def quicksort(left, right):
if left > right:#如果左側哨兵 比右側哨兵大,說明在進入遞歸之前,左側哨兵比右側哨兵大
return
tmp = a[left]#獲得最左側元素作爲基準數
i = left
j = right
while i != j :
#先從右往左找,關注比基準數小的,如果大於基準數,哨兵j左移(-1),找到了a[j]
while a[j] >= tmp and i < j:
j = j - 1
#如果j找到了比基準數小的數,跳出循環。哨兵i繼續找,哨兵i關注比基準數大的,如果小於基準數,哨兵i右移(+1),找到了a[i]
while a[i] <= tmp and i < j:
i = i + 1
#交換兩個數(a[i],a[j])在數組中的位置
if i < j:#如果哨兵i和哨兵j沒有相遇時
t = a[i]
a[i] = a[j]
a[j] = t
#將基準數歸位,左側都爲小於基準數的,右側都爲大於基準數的。
a[left] = a[i]
a[i] = tmp
quicksort(left,i - 1)#基準數左側的繼續排序
quicksort(i + 1, right)#基準數右側的繼續排序
return
if __name__ == '__main__':
print("-------------------- quick sort --------------------")
print(a)
quicksort(0, len(a) - 1)
print(a)