没有最终合并Python的Quicksort

时间:2014-11-02 22:41:10

标签: python quicksort

我是编码和尝试在python中实现quicksort的新手。以下是代码但输出不正确。我哪里错了? 选择pivot作为第一个元素而不必合并。

def quicksort(A):
if len(A) > 1:
    p = A[0]
    i = 0

    for j in A[1:]:
        if j < p:
            A[i] , j = j , A[i]
            i = i+1

        A[0] , A[i] = A[i] , A[0]

    left = A[:i]
    right = A[i+1:]
    left = quicksort(left)
    right = quicksort(right)

    return A
else:
    return A

更改后,代码为

def quicksort(A, left = None, right =None):
if left is None:
    left = 0
if right is None:
    right = len(A)
p =A[left]

i = left +1
for j in A[left+1:right]:
    if A[j] < p:
        A[i] , A[j] = A[j], A[i]
        i = i + 1
A[left] , A[i-1] = A[i-1], A[left]
quicksort(A[:i])
quicksort(A[i+1:])

return A

我收到错误,列表索引超出范围。

1 个答案:

答案 0 :(得分:1)

这些正在制作A

切片的副本
left = A[:i]
right = A[i+1:]

您对副本所做的任何事情都不会影响A

要修改A inplace,你应该传递它以及左右索引作为参数

def quicksort(A, left=None, right=None):
    if left is None:
        left = 0
    if right is None
        right = len(A)
    ...

现在记住leftright是索引(不是代码中的列表)。修改函数的其余部分以直接更改A