不解释直接上代码
def qs(a): return qs([i for i in a[1:] if i <= a[0]]) + a[0:1] + qs([i for i in a[1:] if i > a[0]]) if len(a) > 1 else a
更一般的写法是这样:
def quick_sort(a):
if len(a) > 1:
return quick_sort([i for i in a[1:] if i <= a[0]]) + \
[a[0]] + quick_sort([i for i in a[1:] if i > a[0]])
else:
return a
反思
最初受到启发用列表生成器实现时,关键的一行我是这样写的
return quick_sort([i for i in a if i <= a[0]]) + \
quick_sort([i for i in a if i > a[0]])
当然这是错的,当出现重复数字时(例如[5,2,5]
),左边的递归会陷入死循环。于是我修改为
return quick_sort([i for i in a if i < a[0]]) + \
+ a[0] + quick_sort([i for i in a if i > a[0]])
然而还是错误,因为a[0]
不是列表,不能直接与列表相加。而且重复的数据会丢失。最终修改后才是上面的模样。
暴露的主要问题一是思维不够缜密,二是对基础的掌握欠缺。