我正在尝试使用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
答案 0 :(得分:3)
合并排序是 divide-et-impera 算法:你在不同的子问题(除法部分)中解决问题,然后结合子解决方案来产生问题解决方案( impera 部分)。
在合并排序中,除法部分用于对从列表生成的两个子列表进行排序。 impera 部分采用这两个有序子列表,并将它们合并到一个唯一的有序列表中。当您调用时:
merge([56, 96], [76, 73])
这不起作用,因为合并功能是您的 impera 部分,它需要订购子列表。 您的代码无法正常工作,因为您没有保留有序的子列表,但是您将它们丢弃,因为您没有就地对阵列进行排序。而不是:
merge_sort(array1)
你应该:
array1 = merge_sort(array1)
否则当您致电:
merge(array1, array2)
未列出子列表。