def quick_sort(li, start, end):
# 判断列表退出条件,如果开始未大于结束位将执行完
if start >= end:
return
# 创建游标
left = start
right = end
# 创建基数
mid = li[left]
# 开启列表排序
while left < right:
print(li)
# s1 让右边向左移动 找到比mid小的数
while left < right and li[right] >= mid:
right -= 1
li[left] = li[right]
# s2 左向有移动 找到比mid大的数
while left < right and li[left] < mid:
left += 1
li[right] = li[left]
# 将基数归位
li[left] = mid
# 开始左边 或者 右边的子列表排序
quick_sort(li, start, left - 1)
quick_sort(li, left + 1, end)
if __name__ == '__main__':
# print(a)
l = [3, 6, 5, 4, 8, 90, 12, 43, 88, 109, 9, 3, 2, 1, 2]
# l = 3 [2,1,5,6,5,4]
# [2, 1, 5, 6, 5, 4]
quick_sort(l, 0, len(l) - 1)
# print()
# quicksort([6, 5, 4, 3, 2, 1])
print(l)
# 稳定性:不稳定
# 最优时间复杂度:O(nlogn)
# 最坏时间复杂度:O(n^2
# 快速排序
def quicksort(array):
if len(array) < 2:
return array
else:
#找到一个基准值
pivot = array[0]
#遍历整个列表,将小于这个基准值的元素放到一个子列表中
less = [i for i in array[1:] if i < pivot]
#遍历整个列表,将大于这个基准值的元素放到一个子列表中
greater = [i for i in array[1:] if i>pivot]
#首先,明确我们对元素为0个/1个的列表无需要排序
#使用函数递归
#目标:让我们在一个基准值的一侧变为有序,然后依次返回,让我们的每个基准值的两侧都变得有序
return quicksort(less)+[pivot]+quicksort(greater)
print(quicksort([2,5,3,9,7,11]))
# 因为开辟了很多个列表并没有回收,所以空间复杂度会很大,不是很友好
# 但是比较优雅