基本思想
首先要找一个数作为基准数,用于参照比较。所有比基数大的都放在基数的右边,比基数小的都放在基数的左边。
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)