QuickSort实现可以对列表进行排序不会更新列表

时间:2019-02-05 04:53:11

标签: python python-3.x recursion quicksort

我使用递归在python3.6中实现了快速排序算法。它将列表按升序排序。但是问题是,列表元素的顺序在代码中以及代码运行完成后都不会更改

如果删除了递归的基本情况,并在达到最大递归深度时失败,并将print语句放在partition方法中,则可以看到它更改了列表中的元素

def partition(arr, start, end):
    pivot = arr[end]
    ix = start
    for i in range(start, end):
        print("i = ", i)
        if arr[i] <= pivot:
            arr[i], arr[ix] = arr[ix], arr[i]
            ix += 1
    arr[ix], arr[end] = arr[end], arr[ix]
    return ix

def quick_sort(arr, start, end):
    if start < end: return arr
    ix = partition(arr, start, end)
    quick_sort(arr, start, ix-1)
    quick_sort(arr, ix+1, end)

arr = [2,4,7,8,9,1,3,5,6,12,32]

print("before", arr)
print("output", quick_sort(arr, 0, len(ans)-1))
print("after", arr)

OUTPUT 
before [2, 4, 7, 8, 9, 1, 3, 5, 6, 12, 32]
output [2, 4, 7, 8, 9, 1, 3, 5, 6, 12, 32]
after [2, 4, 7, 8, 9, 1, 3, 5, 6, 12, 32]

1 个答案:

答案 0 :(得分:2)

这里:

if start < end: return arr

逻辑相反。应该是

if start > end: return arr

但是,由于您的函数是就地操作的,因此它不应返回任何内容,因此最好使其返回

if start > end: return

您将看到quick_sort(arr, 0, len(ans)-1)将返回None,但是在函数调用之后,arr将被排序。