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

我刚刚编写了Python快速排序-我希望我有最短的方法来实现这一点(非常类似于函数式方法),因此我写道:

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会话中复制了错误的代码。很好,谢谢。