Quicksort Partition Python

时间:2018-04-04 04:50:11

标签: arrays python-3.x algorithm recursion quicksort

我的快速排序遇到了一些麻烦。这是我的计划:

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".

感谢任何人的帮助。

1 个答案:

答案 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