三行快排

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
今天无意中在网上看到了一段用Python写就的快速排序代码,一共三行,简称三行快排。

-------------------------------------------------------------------------------------------------------


def qsort(L):
    if len(L)<=0: return L
    return qsort([x for x in L if x<L[0]]) + [x for x in L if x==L[0]] + qsort([x for x in L if x>L[0]])


-------------------------------------------------------------------------------------------------------

倘若不算上函数的定义的话,一共就只剩下两行代码,首先就从对其代码分析开始。
[x for x in L if x<L[0]]
这段代码是python中常用的列表推导式,其作用就是对传入的L进行分片,对小于L的第一个元素的值全部取出,形成一个新的列表,这个类表中的所有的元素全部小于L的第一个元素。

[x for x in L if x>L[0]]
这段代码一样,取出大于L的第一个元素的全部值,然后组成一个新的列表。

想必大家现在都很清楚了,这几步实现的就是快排中的分治法的思想,将原列表分为两部分,一部分小于一个值,一部分大于这个值,然后把这个值放在两个列表之间,那两个列表进行递归操作就可以了。

当然,按照算法导论的观点来看的话,这样的排序未必是最优的,原因在于如果输入的列表万一是已经排好序的或者逆序平排好的,那么时间复杂度就达不到理想的状态了,解决的方法就是使算法随机化。对于本例子中可以对L[0]进行处理,比如选取哪个元素进行随机化处理,而不是像本例中规定了选择第一个元素。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值