Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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中的合并排序不会在排序后更新数组 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

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
    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
如何“知道”它应该处理的左右部分。