# 输入一个列表,左端和右端,返回tmp在这段列表中的顺序位置,
# 并且小于tmp的都在tmp左边,大于tmp的都在tmp右边,
def partition(li, left, right):
# 可以将任意位置的值归位,为了方便我们选择左端的值
tmp = li[left]
# 当left等于right的时候说明已经遍历完了,
# left指针和right指针重合,且指向的正是tmp的位置
while left < right:
# 先从右端找一个比tmp小的值,放到tmp的位置上,空出自己的位置
# left<right是先决条件,保证left和right不交叉,
# 并遍历查找比tmp小的值
while left < right and li[right] >= tmp:
# 不满足条件左移一格
right -= 1
# 满足条件,将右指针的值赋给左指针指向的空位
li[left] = li[right]
# 保证不交叉,遍历查找比tmp大的值
while left < right and li[left] <= tmp:
# 不满足条件右移一格
left += 1
# 满足条件,将左指针的值赋给右指针指向的空位
li[right] = li[left]
# 循环结束,left和right重合,指向的就是tmp的有序的位置
li[left] = tmp
return left
def quick_sort(li, left, right):
# 至少有两个元素
if left < right:
mid = partition(li, left, right)
quick_sort(li, left, mid-1)
quick_sort(li, mid+1, right)
# 整个排序过程都是对原列表进行赋值操作,没有开辟新的空间存储列表