ab = [5, 89, 23, 9]
def mergsort(array):
mid = len(array) / 2
if mid > 0:
print (array)
mergsort(array[:mid])
mergsort(array[mid:])
print(array)
merg(array)
return array
def merg(array):
print (array)
mid = len(array)//2
left = array[:mid]
right = array[mid:]
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
array[k] = left[i]
i+=1
else:
array[k] = right[j]
j+=1
k+=1
while i < len(left):
array[k]=left[i]
i+=1
k+=1
while j < len(right):
array[k] = right[j]
j+=1
k+=1
print (array)
mergsort(ab)
print (ab)
merge函数对给定的数组进行排序,并更新数组。但是在下一次递归中,进入merg
函数的数组不是变异数组。
在示例中,首先进行排序,[5,89]
和[23,9]
排序为[5,89]
和[9,23]
,但下一次递归中的合并输入为[5,89,23,9]
而不是[5,89,9,23]
。
我无法找到任何理由,因为变异数组会影响父数组。
答案 0 :(得分:0)
一个问题是递归调用:
mergsort(array[:mid])
mergsort(array[mid:])
这些调用的结果未被记录 - 所以当我们继续时,它使用相同的原始未排序数组完成。
修复:
def mergsort(array):
if len(array) == 1:
return array
mid=len(array)/2
left = mergsort(array[:mid]) # save into a parameter
right = mergsort(array[mid:]) # save into a parameter
return merge(left, right) # use the previous two
第二个问题实际上只与以下问题相同:
def merg(array)
合并操作在两个数组之间完成,这意味着应该将两个不同的数组发送到此函数,否则不会从函数mid
中回忆mergesort()
并声明mid
} {是length/2
处理整个数组而不是我们打算合并的特定两部分。这个函数里面的逻辑背后的想法是正确的,但正如我所提到的,应该在两个&#34; distinct&#34;阵列。
最后一个问题是错误地完成的就地交换,例如:
array[k]=right[j]
通过这样做,我们删除了array[k]
!
修复:
def merge(left, right):
if len(left+right) < 2:
return left+right
res = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
res.append(left[i])
i += 1
elif j < len(right):
res.append(right[j])
j += 1
while i < len(left):
res.append(left[i])
i += 1
while j < len(right):
res.append(right[j])
j += 1
return res
应用这两个修补程序并运行后:
print mergsort(ab)
输出结果为:
[5, 9, 23, 89]
根据需要。