python中的合并排序不会在排序后更新数组 ab=[5,89,23,9] def mergsort(阵列): mid=透镜(阵列)/2 如果mid>0: 打印(数组) mergsort(数组[:mid]) mergsort(数组[mid:]) 打印(数组) merg(阵列) 返回数组 def merg(阵列): 打印(数组) mid=len(数组)//2 左=数组[:中] 右=数组[mid:] i=j=k=0 而i
merge函数对给定的数组进行排序,并更新该数组。但是在下一个递归中,进入python中的合并排序不会在排序后更新数组 ab=[5,89,23,9] def mergsort(阵列): mid=透镜(阵列)/2 如果mid>0: 打印(数组) mergsort(数组[:mid]) mergsort(数组[mid:]) 打印(数组) merg(阵列) 返回数组 def merg(阵列): 打印(数组) mid=len(数组)//2 左=数组[:中] 右=数组[mid:] i=j=k=0 而i,python,sorting,recursion,merge,Python,Sorting,Recursion,Merge,merge函数对给定的数组进行排序,并更新该数组。但是在下一个递归中,进入merg函数的数组不是变异数组 在本例中,发生了第一次排序,[5,89]和[23,9]被排序为[5,89]和[9,23],但下一次递归中的合并输入是[5,89,23,9],而不是[5,89,9,23] 我找不到任何原因,因为改变数组会影响父数组。递归调用有一个问题: ab = [5, 89, 23, 9] def mergsort(array): mid = len(array) / 2
merg
函数的数组不是变异数组
在本例中,发生了第一次排序,[5,89]
和[23,9]
被排序为[5,89]
和[9,23]
,但下一次递归中的合并输入是[5,89,23,9]
,而不是[5,89,9,23]
我找不到任何原因,因为改变数组会影响父数组。递归调用有一个问题:
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)
这些调用的结果不会被记录,所以当我们继续时,它将使用相同的原始未排序数组完成
修复方法:
mergsort(array[:mid])
mergsort(array[mid:])
array[k]=right[j]
第二个问题实际上是同一类问题,只是:
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
合并操作是在两个数组之间完成的,这意味着两个不同的数组应发送到此函数,否则从函数mergesort()中无法回忆到mid
并将mid
声明为length/2
处理整个数组,而不是我们要合并的特定两个部分。这个函数中的逻辑背后的想法是正确的,但正如我提到的,应该在两个“不同”的数组上完成
最后一个问题是未正确完成的就地交换,例如:
def merg(array)
通过这样做,我们将擦除数组[k]
处的元素
修复方法:
mergsort(array[:mid])
mergsort(array[mid:])
array[k]=right[j]
输出为:
print mergsort(ab)
根据需要。嘿。。谢谢你清楚的解释。但我有一个疑问,当我在merge函数中使用list变量时,它不会自动更新merge排序中的数组。我可以看到它没有发生,它没有发生。但是不明白为什么?@user32175请再次阅读我的解释,请特别注意关于您传递给
merge
的内容的部分,以及merge
如何“知道”它应该处理的左右部分。