快速排序:取出列表中的第一个值,经过排序,找到他在列表中最终的位置,左边的数都小于该值,右边的数都大于该值。
为了实现这一过程,需要两个游标 low 和 high。取出的值标记为mid_value
1.取出中间值后,该值的下标为low, low
while low < high and list1[high] >= mid_value:
high -= 1
list1[low] = list1[high]
3.比较下标为low的值是否小于中间值,如果小于,则low += 1,游标向后走
如果大于等于中间值,则跳出循环,将下标为low的值赋给下标为high元素
while low < high and list1[low] < mid_value:
low += 1
list1[high] = list1[low]
4.一次循环结束后,即low>=high,就找到了列表中第一个值的位置(54)。并将该值放回到列表中的正确位置
list1[low] = mid_value
该值左边的数都小于54,右边的数都大于等于54.
接下来将数列分成两部分,小于54 和 大于等于54。使用递归再次进行排序。
小于54 的一部分中 起始位置的下标是当做是first,终止位置的下标是low-1
大于等于54 的部分,起始位置的下标是low+1,终止位置的下标是last。
再次调用函数进行排序。
又经过一次排序后,小于54那部分中的第一个数20,找到了正确的位置,大于等于54那部分中的第一个数77也找到了正确的位置。
以此类推,在对26左边部分和右边部分进行排序,对77左边部分和右边部分排序。
使用递归要写一个出口,就是当first>=last时,要返回,不能继续递归。
def quick_sort(list1, first, last):
if first >= last:
return
low = first
high = last
mid_value = list1[first]
while low < high:
while low < high and list1[high] >= mid_value:
high -= 1
list1[low] = list1[high]
while low < high and list1[low] < mid_value:
low += 1
list1[high] = list1[low]
list1[low] = mid_value
quick_sort(list1, first, low-1)
quick_sort(list1, low+1, last)
list1 = [54, 26, 93, 17, 77, 31, 44, 55]
quick_sort(list1, 0, len(list1)-1)
print(list1)
>>[17, 26, 31, 44, 54, 55, 77, 93]