使用合并排序合并和排序列表

时间:2014-03-16 17:36:03

标签: python algorithm sorting mergesort

这是我的代码

def merge_lists(all_lst):
    if len(all_lst) < 2:
        return all_lst[0]   # get rid of the extra [] 
    left = merge_lists(all_lst[:len(all_lst)//2]) #[[2, 7, 10]]  ##[[0, 4, 6]]      
    right = merge_lists(all_lst[len(all_lst)//2:])#[[0, 4, 6], [3, 11]] ##[[3,11]]
    def merge(left,right):
        results = []
        while left and right:
            if left[0] < right[0]:
                results.append(left[0])
                left.remove(left[0])
            else:
                results.append(right[0])
                right.remove(right[0])
        results.extend(left)
        results.extend(right)
        return results
    return merge(left, right) 

当我把这个

时,我能得到答案
all_lst = [[2, 7, 10], [0, 4, 6], [3, 11]]
print(merge_lists(all_lst)) # [0, 2, 3, 4, 6, 7, 10, 11]

但是当我尝试改变它时它已经不起作用了

 all_lst = [[2, 7, 10], [0, 4, 6], [3, 11, 1]]
print(merge_lists(all_lst)) ##[0, 2, 3, 4, 6, 7, 10, 11, 1]

我可能知道什么是错的

1 个答案:

答案 0 :(得分:0)

第三个列表未排序。当你进行最后的延伸时,插入1 最终名单的结尾。 您应该在调用合并之前对列表进行排序。

换句话说,您的输入应为:

 all_lst = [[2, 7, 10], [0, 4, 6], [1, 3, 11]]

他们合并作品的方式是假定订单是有序的。

例如,取两个列表:

left = [1, 3]
right = [2, 4]
results = []    

合并是这样的:

if left[0] < right[0]:
    results.append(left[0])
    left.remove(left[0])

所以现在

results = [1]
left = [3]
right = [2,4]

但如果你有:

left = [3, 1]
right = [2, 4]
results = []   

合并是这样的:

if left[0] < right[0]: #false
else:
    results.append(right[0])
    right.remove(right[0])

所以现在

results = [2]
left = [3,1]
right = [4]

因此你最终得到了无序的最终名单。