Python 以功能性方式实现快速排序
我刚刚编写了Python快速排序-我希望我有最短的方法来实现这一点(非常类似于函数式方法),因此我写道:Python 以功能性方式实现快速排序,python,quicksort,Python,Quicksort,我刚刚编写了Python快速排序-我希望我有最短的方法来实现这一点(非常类似于函数式方法),因此我写道: def quicksort(List): if len(List)>1: Pivot=List[0] return quicksort(lessThan(List,Pivot)) + [Pivot] + quicksort(moreThan(List,Pivot)) else: return Lis
def quicksort(List):
if len(List)>1:
Pivot=List[0]
return quicksort(lessThan(List,Pivot)) + [Pivot] + quicksort(moreThan(List,Pivot))
else:
return List
def lessThan(List, Pivot):
lessThanList = [x for x in List if x <= Pivot]
return lessThanList
def moreThan(List, Pivot):
moreThanList = [x for x in List if x > Pivot]
return moreThanList
def快速排序(列表):
如果len(列表)>1:
Pivot=列表[0]
返回快速排序(小于(列表,透视))+[Pivot]+快速排序(大于(列表,透视))
其他:
返回列表
def lessThan(列表、枢轴):
lessThanList=[x代表列表中的x,如果x轴为x]
返回超过个列表
不幸的是,它跳过了所有数字的多重显示。好吧,这似乎是合乎逻辑的,但当我试图改进写作时:
def lessThan(List, Pivot):
lessThanList = [x for x in List if x <= Pivot]
return lessThanList
def lessThan(列表,透视):
lessThanList=[x代表列表中的x,如果x,由于使用第一个元素作为轴心,防止无限递归的最简单方法是避免将第一个元素传递给lessThan
。添加两个字符,如下所示:
return quicksort(lessThan(List[1:],Pivot)) + ...
^^
清除?除第一个元素(轴)外,它通过列表
但是请注意,您仍然可以得到大约等于原始列表长度的递归;例如,想象排序[2,2,2,2,2,2,2,2]
由于您使用第一个元素作为轴心,因此防止无限递归的最简单方法是避免将第一个元素传递给小于的部分。添加两个字符,如下所示:
return quicksort(lessThan(List[1:],Pivot)) + ...
^^
清除?除第一个元素(轴)外,它通过列表
但是请注意,您仍然可以得到大约等于原始列表长度的递归;例如,想象排序[2,2,2,2,2,2,2,2]
任何与透视图
相同的附加项目都会丢失-您的lessThan或more列表都不会包含它们,您只会插入[pivot]的一个实例
在两个子列表之间。将lessThan
更改为使用等于pivot
的任何附加项将丢失-lessThan和more列表都不会包含它们,并且您只插入[pivot]的一个实例
在两个子列表之间。将lessThan
更改为使用别人指出的,您的疏忽是在划分列表时没有删除轴心。如果您喜欢以函数式编写,Python提供了表达性语言构造,
比如,我们可以利用有助于避免容易犯错误的优势:
def quicksort(seq):
if len(seq) <= 1:
return seq
pivot, *rest = seq
smaller = quicksort([x for x in rest if x <= pivot])
larger = quicksort([x for x in rest if x > pivot])
return smaller + [pivot] + larger
正如其他人所指出的,您的疏忽是在对列表进行分区时没有删除轴心。如果您喜欢以函数式风格编写,Python提供了表达性语言构造,
比如,我们可以利用有助于避免容易犯错误的优势:
def quicksort(seq):
if len(seq) <= 1:
return seq
pivot, *rest = seq
smaller = quicksort([x for x in rest if x <= pivot])
larger = quicksort([x for x in rest if x > pivot])
return smaller + [pivot] + larger
导致问题的最小数据是什么?导致问题的最小数据是什么?这是一个很好的答案,除了您发布的代码在您给出的示例中会出现无限递归。您只在末尾调用一次quicksort
。应该是return quicksort(较小)+[pivot]+quicksort(较大)
取而代之。@TimPeters是的,我从我的shell会话中错误地复制了它。捕捉得好。谢谢。这是一个很好的答案,除了你发布的代码在你给出的示例中遭受无限递归。你只在末尾调用一次快速排序。应该是返回快速排序(较小)+[pivot]+快速排序(较大)
取而代之。@TimPeters是的,我从shell会话中复制了错误的代码。很好,谢谢。