以下是我在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生成的序列并运行代码,它就会完美排序。有什么我想念的吗?
答案 0 :(得分:0)
Numpy数组的行为与列表不同。合并步骤失败,因为当x
是一个numpy数组时,y
和a
将是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] !