繁体   English   中英

Python中快速排序算法的解释

[英]Explanation about quicksort algorithm in Python

我正在关注快速排序算法课程的代码行,其中包含以下代码行:

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0] #Recursive case
        less = [i for i in array[1:] if i <= pivot] #Sub-array of all elements < pivot
        greater = [i for i in array[1:] if i > pivot] #sub array of all elements > pivot
        return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([1,15,7,3,9]))

如果枢轴设置在array[0] ,我会成功运行代码,但是当我更改为其他数字时失败,例如 2,3。 错误消息是list index out of range

现在我很困惑,如果列表中有 5 个实例,它怎么会超出范围? 如果我将枢轴更改为其他数组位置而不是 [0],为什么代码不起作用? 我认为可以将枢轴设置为任何其他元素位置以加快过程? 谢谢!

代码将使用数组的较小子集递归调用。 较小的子集可以有 2 个元素,在这种情况下,访问array[2]将导致index out of range

例如,在上面的测试中,如果您使用array[2]作为主元,则代码中枢轴为array[2]=7并递归调用quicksort([7,3])quicksort([15,9]) 如果您使用array[2]作为这两个子array[2]枢轴,它肯定会超出范围。 (请参阅下面的代码和输出)。

除了list index out of range错误。 我想就您的实施提出 2 条意见:

  • 如果使用除array[0]以外的枢轴,请确保相应地调整 set array[1:] (它应该是array[:p] + array[p+1:]
  • 快速排序相对于其他排序算法(例如归并排序)的一个优点是它可以就地实现并且需要 O(log N) 额外内存。 使用lessgreater那种失败的这一优势。

代码示例:

def quicksort(array):
    print(array)
    if len(array) < 2:
        return array
    else:
        pivot = array[2] #Recursive case
        less = [i for i in array[1:] if i <= pivot] #Sub-array of all elements < pivot
        greater = [i for i in array[1:] if i > pivot] #sub array of all elements > pivot
        return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([1,15,7,3,9]))

输出:

[1, 15, 7, 3, 9]
[7, 3]
IndexError: list index out of range

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM