python正在改变我的列表

时间:2014-09-07 14:33:44

标签: python list mergesort

我正在尝试使用Python中的列表实现合并排序算法。 我的合并代码很好(我现在不会把它放在这里,但如果你问我,我可以高兴地发布它),但是当它返回到上面的递归级别时,列表被洗牌,我不知道为什么

为了说明,这是发生了什么:

array 1: [56]
array 2: [96]
merged array: [56, 96]    # the merge is fine

array 1: [76]
array 2: [73]
merged array: [73, 76]    # here too

请注意,合并确实很好。但是,请注意下一节中的'数组2'是混乱的(理论上与上面[73,76]的列表相同)

array 1: [56, 96]
array 2: [76, 73]         # this is broken
merged array: [56, 76, 73, 96]

它通过递归执行随机发生。请注意,它出现在数组1中,而不是数组2,显示错误不在我的代码中:

array 1: [96]
array 2: [34]
merged array: [34, 96]

array 1: [19]
array 2: [34] 
merged array: [19, 34]

array 1: [96, 34]          # this is broken too
array 2: [19, 34]
merged array: [19, 34, 96, 34]

这样,我就不能使用这种合并排序来排序列表。 如果python的列表是有序序列,那么任何人都可以知道为什么会发生这种情况吗?

如上所述,这是代码:

def merge_sort(array):
    if len(array) > 1:
        array1, array2 = partition(array)
        merge_sort(array1)
        merge_sort(array2)
        array = merge(array1, array2)
    return array

def partition(array):
    n = len(array) / 2
    array1 = array[0:n]
    array2 = array[n::]

    return array1, array2   

def merge(a, b):
    array = []
    while len(a) > 0 or len(b) > 0:
        if len(a) > 0 and len(b) > 0:
            if a[0] <= b[0]:
                array.append(a.pop(0))
            else:
                array.append(b.pop(0))
        elif len(a) > 0:
            array.append(a.pop(0))
        elif len(b) > 0:
            array.append(b.pop(0))
    return array

1 个答案:

答案 0 :(得分:3)

合并排序是 divide-et-impera 算法:你在不同的子问题(除法部分)中解决问题,然后结合子解决方案来产生问题解决方案( impera 部分)。

在合并排序中,除法部分用于对从列表生成的两个子列表进行排序。 impera 部分采用这两个有序子列表,并将它们合并到一个唯一的有序列表中。当您调用时:

merge([56, 96], [76, 73])

这不起作用,因为合并功能是您的 impera 部分,它需要订购子列表。 您的代码无法正常工作,因为您没有保留有序的子列表,但是您将它们丢弃,因为您没有就地对阵列进行排序。而不是:

merge_sort(array1)

你应该:

array1 = merge_sort(array1)

否则当您致电:

merge(array1, array2)

未列出子列表。