Python MergeSort-使用numpy生成测试序列时的奇怪行为

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

以下是我用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]
    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])来解决这个问题吗?