我正在用Python实现Stooge Sort,但我不明白为什么我对数组顺序的更改没有坚持。换句话说,当我递归向下钻取时,似乎正在交换单元格,但是在函数返回后,数组的顺序不变。是范围问题,还是我不了解的其他Python风格?还是我的算法不正确?
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
答案 0 :(得分:1)
问题出在您的切片上-A[0:m]
等。这些切片不会在原始列表中创建视图,而是创建新列表。
您可以使用at the bottom of this answer中所述的numpy数组,也可以使用递归调用的返回值来构造要返回的新列表。
答案 1 :(得分:0)
1.--您将原始数组的副本发送给递归,而不仅仅是原始数组的一部分。 2.-尽管您将发送原始数组的一部分,但是pseudocode Stooge Sort algorithm不适用于数组的一部分,而仅适用于索引。
def StoogeSort(L, i, j):
if L[i] > L[j]: #<-- always switching elements (not just for n=2)
L[j],L[i]=L[i],L[j]
if (j - i + 1) > 2:
t = int((j - i + 1) / 3)
StoogeSort(L, i, j-t) #<-- here, sending indexes.
StoogeSort(L, i+t,j)
StoogeSort(L, i, j-t)
return L
>>> L = [7,8,9,5,6,4,2,1]
>>> StoogeSort(L, 0, len(L)-1)
[1, 2, 4, 5, 6, 7, 8, 9]