Python MergeSort-使用numpy生成测试序列时的奇怪行为
以下是我用python编写的MergeSort的快速实现:Python MergeSort-使用numpy生成测试序列时的奇怪行为,python,algorithm,sorting,numpy,Python,Algorithm,Sorting,Numpy,以下是我用python编写的MergeSort的快速实现: import numpy def mergeSort(a): if len(a) ==1: return if len(a) == 2: if a[0] > a[1]: tmp = a[0] a[0] = a[1] a[1] = tmp return x = a[0:len(a)/2
import numpy
def mergeSort(a):
if len(a) ==1:
return
if len(a) == 2:
if a[0] > a[1]:
tmp = a[0]
a[0] = a[1]
a[1] = tmp
return
x = a[0:len(a)/2]
y = a[len(a)/2:]
mergeSort(x)
mergeSort(y)
j=0
k=0
for i in xrange(len(a)):
if j == len(x) or k<len(y) and x[j] > y[k]:
a[i] = y[k]
k = k + 1
else:
a[i] = x[j]
j = j + 1
a = numpy.random.randint(100, size=3) # Generates say [20 3 75]
mergeSort(a)
print a # Yields [3, 3, 75] !
a = [20,3,75]
mergeSort(a)
print a # Yields [3, 20, 75] !
导入numpy
def合并排序(a):
如果len(a)==1:
返回
如果len(a)==2:
如果a[0]>a[1]:
tmp=a[0]
a[0]=a[1]
a[1]=tmp
返回
x=a[0:len(a)/2]
y=a[len(a)/2:]
合并排序(x)
合并排序(y)
j=0
k=0
对于x范围内的i(len(a)):
如果j==len(x)或ky[k]:
a[i]=y[k]
k=k+1
其他:
a[i]=x[j]
j=j+1
a=numpy.random.randint(100,size=3)#生成say[20 3 75]
合并排序(a)
打印a#收益率[3,3,75]!
a=[20,3,75]
合并排序(a)
打印a#收益率[3,20,75]!
当我使用numpy为我生成随机数组时,这个实现莫名其妙地失败了,而如果我对失败的numpy生成的序列中的一个进行硬编码并运行代码,它会进行完美的排序。有什么我遗漏的吗?Numpy数组的行为与列表不同。合并步骤失败,因为当
a
是numpy数组时,x
和y
将是a
的视图。您可以将list(a)
传递到mergeSort
例程以使其工作:
import numpy
def mergeSort(a):
if len(a) ==1:
return
if len(a) == 2:
if a[0] > a[1]:
tmp = a[0]
a[0] = a[1]
a[1] = tmp
return
x = a[0:len(a)/2]
y = a[len(a)/2:]
mergeSort(x)
mergeSort(y)
j=0
k=0
for i in xrange(len(a)):
if j == len(x) or k<len(y) and x[j] > y[k]:
a[i] = y[k]
k = k + 1
else:
a[i] = x[j]
j = j + 1
a = numpy.random.randint(100, size=3) # Generates say [20 3 75]
a = list(a)
mergeSort(a)
a = numpy.array(a)
print a # correctly Yields [3, 20, 75] !
a = [20,3,75]
mergeSort(a)
print a # Yields [3, 20, 75] !
导入numpy
def合并排序(a):
如果len(a)==1:
返回
如果len(a)==2:
如果a[0]>a[1]:
tmp=a[0]
a[0]=a[1]
a[1]=tmp
返回
x=a[0:len(a)/2]
y=a[len(a)/2:]
合并排序(x)
合并排序(y)
j=0
k=0
对于x范围内的i(len(a)):
如果j==len(x)或ky[k]:
a[i]=y[k]
k=k+1
其他:
a[i]=x[j]
j=j+1
a=numpy.random.randint(100,size=3)#生成say[20 3 75]
a=列表(a)
合并排序(a)
a=numpy.array(a)
正确打印a#会产生[3,20,75]!
a=[20,3,75]
合并排序(a)
打印a#收益率[3,20,75]!
NumPy数组不是列表,其行为与列表不同。例如,切片一个NumPy数组会生成原始数据的视图,而不是副本。您是否尝试使用策略性放置的打印函数来查看发生了什么?我想这就是原因。另外,如果你能发布从numpy获取列表的最快方法,我可以将其标记为答案。是的,我试过打印,但没想到数组的突变片段会发生突变原始列表(a)非常快a。tolist()
通常比list(a)
好。我认为这里值得一提的是,合并步骤失败,因为当a是numpy数组时,x和y将是“a”的视图。这是真的。你能把它们改成x=list(a[0:len(a)/2])来解决这个问题吗?