我的快速排序遇到了一些麻烦。这是我的计划:
def main():
Array = [10, 5, 3, 8, 6, 7, 4, 9, 2, 1, 10]
right_index = (len(Array) - 1)
left_index = 0
Quicksort(Array, left_index, right_index)
def Quicksort(Array, left_index, right_index):
if len(Array) == 1:
return Array
pivot_index = Partition(Array, left_index, right_index)
Quicksort(Array, left_index, pivot_index-1)
Quicksort(Array, pivot_index + 1, right_index)
return Array
def Partition(Array, left_index, right_index):
pivot = Array[left_index]
i = left_index + 1
for j in range(left_index + 1, right_index):
if Array[j] <= pivot:
Array[j], Array[i] = Array[i], Array[j]
i += 1
Array[left_index], Array[i - 1] = Array[i - 1], Array[left_index]
return i - 1
main()
我做错了吗?我收到错误:for j in range(left_index + 1, right_index)
:
RecursionError: maximum recursion depth exceeded in comparison".
感谢任何人的帮助。
答案 0 :(得分:1)
当您收到递归错误时,您的终止条件通常会出现问题。 (这是moghya试图告诉你的,虽然不是很清楚。)在你的情况下:
if len(Array) == 1:
return Array
您使用两个索引来跟踪您当前正在处理的子阵列。基数组Array
的长度始终为11;您对该数组所做的唯一更改是交换元素。因此,您的终止条件应为:
if left_index >= right_index:
return Array
您的代码中还有另一个错误:当您对数组进行分区时,会错过最后一个元素。这里:
for j in range(left_index + 1, right_index):
上限应为right_index + 1
。由于您选择使用包含上限,因此{1}}是最后一个有效索引,因此可能会引入此错误一个错误。
这不是Python(和许多其他语言)处理数组的方式。 Python数组和范围具有包含下限和独占上限。零基础指数和排他性上限一开始似乎有点相似,但我建议你接受而不是反对这个惯例。
我还建议你编写一个包装器quicksort函数,它不需要显式地传入数组。把所有这些放在一起,你得到:
right_index