我正在遵循快速排序算法课程的代码行,其中包含以下代码行:
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],为什么代码不起作用?我认为可以将枢轴设置为任何其他元素位置以加快该过程?谢谢!
答案 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:]
)less
和greater
会破坏这种优势。 代码示例:
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