Python算法入门——第3章 3.2 快速排序

所谓快速排序,顾名思义,就是一种速度较快的排序方法,是一种常用的排序算法。快速排序基于 D&C 策略(分而治之)即不断把问题细分、化整为零从而把难以处理的大问题变成小问题来处理。一个非常经典的案例就是秦国一统六国,采用远交近攻分而治之的策略。当你不能把眼前的问题解决的时候,你就可以采用分而治之的策略,不断地化整为零,直到变成你能处理的规模。假如说,你顽固的老丈人不同意你与你女朋友的婚事,也许你尝试去讨好他,但是收效甚微。那么你就应该转换方向,转而去讨好你丈母娘(虽然说丈母娘才是最难对付的一个,这里就让我们假设丈母娘通情达理),你未来的小舅子。等你做好了她们的工作之后,我相信你老丈人会动摇的。如果你是属于那种 “房子一扒,帕拉梅拉” 的壕级朋友,那么请你忽略这种方法。

那么现在就来讲一下快速排序的原理。假如给定数组 [ 3,2,6,9,1,5] 要我们对其进行排序,当然我们可以选用Python自带的sorted函数直接一步到位,但我们现在讲的是分而治之的策略,既然讲策略,你就当没有sorted这个函数。

1,首先,我们从列表里面随机抓出一个幸运数字来当哨兵。那么本次我们就选择数字3 。枪打出头鸟嘛

2,将大于数字 3 的全部放到3 的右边,小于数字 3 的放到 3 的左边。那么数组就会变成 [2,1,3,6,9,5] 

3,接着对左边的数组 [2,1] 重复步骤二,对右边的数组重复步骤二,那么就会得到 [1,2] ,[3],[5,6,9],这样我们就成功地将数组排序了。接下来将数组进行合并就可以了。

我们在进行步骤 3 的时候实际上是在重复步骤 2 ,那么我们使用递归不断调用步骤 2 即可。上代码:

def Solution(arry_list):
    '''
    利用分而治之的方法,通过递归调用,来实现快速排序
    :param arry_list:给定一个无序数组
    :return:返回排顺序的数组
    '''
    #如果数组只有一个数字或者为空列表,那么直接就返回原列表即可。同时这是结束递归调用的条件
    if len(arry_list) < 2:
        return arry_list
    #如果列表元素大于1个,那么就进行递归调用
    else:
        #设置数组的第一个数字为哨兵
        guard = arry_list[0]
        #利用列表生成器,如果列表里面的数小于哨兵就放进less_than
        less_than = [ i for i in arry_list[1:] if i <= guard]
        #利用列表生成器,如果列表里面的数大于哨兵就放进greater_than
        greater_than = [ i for i in arry_list[1:] if i > guard]
        #不断递归调用函数本身
        return Solution(less_than) + [guard] + Solution(greater_than)

#主函数
if __name__ == "__main__":
    print(Solution([2,3,6,1,4,7,5]))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值