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

时间:2017-06-27 18:59:29

标签: 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]
    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为我生成随机数组时,这个实现莫名其妙地失败了,而如果我硬编码其中一个失败的numpy生成的序列并运行代码,它就会完美排序。有什么我想念的吗?

1 个答案:

答案 0 :(得分:0)

Numpy数组的行为与列表不同。合并步骤失败,因为当x是一个numpy数组时,ya将是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] !