首页 > 解决方案 > 如何处理递归python排序函数中的范围

问题描述

我正在用 Python 实现 Stooge Sort,但我不明白为什么我对数组排序的更改没有坚持下去。换句话说,当我递归地向下钻取时,似乎正在交换单元格,但是在函数返回之后,我的数组的顺序没有改变。这是一个范围问题,还是我还不明白的其他一些pythonism?还是我的算法不正确?

import math

def StoogeSort(A):

    n = len(A)

    if (n == 2 and A[0] > A[1]):

        tmp = A[0]
        A[0] = A[1]
        A[1] = tmp 

    elif n > 2:

        m = int(math.ceil((2 * n) / 3)) 
        StoogeSort(A[0:m]) 
        StoogeSort(A[m-n:n]) 
        StoogeSort(A[0:m]) 

    return A


A = [4,2,1]
StoogeSort(A)
print "End:",A
A = [44,12,8,33,100]
StoogeSort(A)
print "End:",A

标签: pythonsortingscope

解决方案


问题在于您的切片 -A[0:m]等。这些不会创建原始列表的视图,而是创建新列表。

您可以使用本答案底部所述的 numpy 数组,或者使用递归调用的返回值来构造要返回的新列表。


推荐阅读