python 快速排序

快速排序

class QuickSort2(object):
    def sort(self, lst, left_bound, right_bound):
        """
        :param lst:  待排序数组
        :param left_bound: 左边界
        :param right_bound: 右边界
        :return:  返回排好序的数组
        """
        if left_bound >= right_bound:  # 只有一个数甚至是空数组
            return
        # 找出中轴应该在的位置
        mid = self.partition(lst, left_bound, right_bound)
        # 中轴左边的排序找中轴
        self.sort(lst, 0, mid - 1)  # 中轴已经找到,左边新的边界应该是中轴前面一个
        # 中轴要右边的排序找中轴
        self.sort(lst, mid + 1, right_bound)  # 右边的新边界是中轴后面一个

    def partition(self, lst, left_bound, right_bound):
        """找中轴,一般假设最后一个数为中轴,但是最好随机选择一个作为中轴"""
        # 假设一个中轴
        axis = lst[right_bound]
        # 设置左边哨兵和右边哨兵的起始位置
        left = left_bound
        right = right_bound - 1  # 因最右边那个数用作中轴了,所以哨兵退一位
        # 寻找中轴位置
        while left <= right:  # 哨兵左不能超过哨兵右,
            while left <= right and lst[left] <= axis:
                left += 1  # 哨兵所在位置比中轴小,数字位置正确,哨兵前进
            while left <= right and lst[right] > axis:  # 左边选了等于右边就不能选等于
                right -= 1  # 哨兵所在位置比中轴大,数字位置正确,哨兵前进
            # 左右哨兵都移动完成以后,证明左右哨兵所在位置为数字不正确的位置
            # (比中轴小的在中轴左边,比中轴大的在中轴右边),交换两个哨兵所在的数字
            if left < right:  # 左哨兵小于右哨兵才交换,等于都不行
                lst[left], lst[right] = lst[right], lst[left]
        # 将本轮中所有的数字放到正确位置以后,将中轴放到应该放的位置(因左边哨兵小于等于中轴,所以最后哨兵在的位置是中轴的位置,交换)
        lst[left], lst[right_bound] = lst[right_bound], lst[left]
        return left
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

break2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值