原理:
从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,
- 所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
- 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
python实现:
# 完成一轮交换
def sub_sort(lst, low, high):
# 选定基准
x = lst[low]
# low 向后,high 向前
while low < high:
# 后面的数往前走
while lst[high] >= x and high > low:
high -= 1
# 遇到小于x的数,向前甩
lst[low] = lst[high]
# 前面的数往后走
while lst[low] < x and low < high:
low += 1
# 遇到大于x的数,向后甩
lst[high] = lst[low]
# 循环结束,将基准数放置在当前low的位置
lst[low] = x
# 返回当前low的索引值
return low
def quick(lst, low, high):
# low 表示列表第一个元素索引,high表示最后一个元素索引
if low < high:
key = sub_sort(lst, low, high)
quick(lst, low, key-1)
quick(lst, key+1, high)
lst = [9,1,8,3,4,5,6,7,2]
quick(lst, 0, len(lst)-1)
print(lst)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]