python中的合并排序在排序后不会更新数组

时间:2015-03-21 06:46:44

标签: python sorting recursion merge

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]

我无法找到任何理由,因为变异数组会影响父数组。

1 个答案:

答案 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]

根据需要。