python 快排

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]))

# 因为开辟了很多个列表并没有回收,所以空间复杂度会很大,不是很友好
# 但是比较优雅

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值