def quick(lst, start, end):
"""
快速排序 复杂度 N * (logN)
原理为有两个指针:low, high 分别指向列表的第一个元素,和列表最后一个元素,和一个中间值 mid(就是取列表的第一个元素)
一开始 low 默认情况下就指向了mid, high 指向列表最后一个元素
[8, 3, 15, 7, 6, 2]
| |
low high
如果high 指向的值比mid大,则high往前移动,如果high比mid 小,就把high 指向的值和low交换
lst[low], lst[high] = lst[high], lst[low]
如果low比mid小low往前移动一位, 如果low比mid大,则low指向的值和high 指向的值交换
lst[high], lst[low] = lst[low], lst[high]
当low 和 high 指针移动到相同的位置时,则mid就应该放在这个位置
:param lst:
:param start:
:param end:
:return:
"""
if start >= end:
return
low = start
high = end
mid = lst[start]
while low < high:
# high > mid 往前移动 high
while low < high and lst[high] >= mid:
high -= 1
lst[high], lst[low] = lst[high], lst[low]
# low < mid 往前移动 low
while low < high and lst[low] < mid:
low += 1
lst[low], lst[high] = lst[low], lst[high]
# 当循环退出时就是 low 和 high 位置重叠的时候,mid 就应该放在这个位置
# 然后此时以mid 为界限,左边的元素都小于mid, 右边的元素都大于mid,则我们只需要使用递归的方法排序好左边的
# 和右边的元素即可
lst[low] = mid
quick(lst, start, low - 1)
quick(lst, low + 1, end)
if __name__ == "__main__":
ls = [22, 56, 38, 101, 1, 18, 20, 30]
print("排序前", ls)
quick(ls, 0, len(ls) - 1)
print("排序后", ls)
python 快排
最新推荐文章于 2023-06-13 22:06:13 发布