-
从序列中取出第一个数,作为边界条件,判断此数应该在哪个位置。用一个mid接收这个数,然后用两个游标low和high进行左右夹击,找到第一个数的具体位置,此时low=high,把mid放到这个位置
-
它以mid为基准,把大的换到一边,小的换到一边
# 快速排序
# 右标签找比mid值小的数,如果找不到,右标签向左移动,找到后该位置值和mid值位置交换(第一次时,mid值在第一位)
# 左标签找比mid值大的数,如果找不到,左标签向右移动,找到后该位置值和mid值位置交换
# 它以mid为基准,把大的换到一边,小的换到一边
# 修改迭代深度
import sys
sys.setrecursionlimit(1000000) #例如这里设置为十万
# 也要准备左侧标签和右侧标签
# 为什么要添加标签参数,不是内部循环用的吗?
def quick_sort(alist,start,end):
# 如果列表里面只有一个值,直接返回列表
if start >= end:
return alist
else:
# 准备工作
left = start # 左标签
right = end # 右标签
mid = alist[start]
# 标签移动
# 当left小于right时,标签移动,同时右边值大于等于mid(标签)值
# left是左边值下标位置,right是右边值的下标位置,
# 只有left<right时,才会做这些循环
while left < right:
while left < right and alist[right] >= mid:
# 如果符合while循环,则right值往前面移动,right-1
right -= 1
# 当找到之后,左标签值和右标签值互换
alist[left] = alist[right]
# left值右移动
while left < right and alist[left] < mid:
# 如果符合while循环,则left值往前面移动,left+1
left += 1
# 当找到之后,左标签值和右标签值互换
alist[right] = alist[left]
# 插入mid应该在的位置(对换mid的值)
# left,right都可以,此时两值相等
alist[left] = mid
# 分组进行前面两个步骤
# 分成了两部分,左边从0到left-1的位置为一组,右边从left+1位置到最后
# 左侧部分
quick_sort(alist,start,left-1)
# 右侧部分
quick_sort(alist,left+1,end)
if __name__ == '__main__':
alist = [1,5,94,97,6,87]
print('开始排序')
quick_sort(alist,0,len(alist)-1) # len(alist)-1刚好是列表最后一个元素的下标位置
print('执行完毕')
print(alist)