关于Python中的快速排序算法的说明

时间:2019-12-18 04:30:36

标签: python algorithm sorting quicksort

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

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],为什么代码不起作用?我认为可以将枢轴设置为任何其他元素位置以加快该过程?谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

除了list index out of range错误。我想对您的实施提出2条评论:

  • 如果使用除array[0]以外的枢轴,请确保相应地调整集合array[1:](应为array[:p] + array[p+1:]
  • 与其他排序算法(例如mergesort)相比,快速排序的一个优点是它可以就地实现并且需要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