使用归并排序合并并排序列表
这是我的代码
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]
我想知道哪里出了问题
2 个回答
0
如果你的意思是想对合并后的列表进行排序,那么你可以使用 sum()
函数,然后再进行排序:
list1 = [[2, 7, 10], [0, 4, 6], [3, 11]]
list2 = [[2, 7, 10], [0, 4, 6], [3, 11, 1]]
list3 = [[10, 567, 34], [-10, -30, -109], [98, 10001, 5]]
def merge_sort(lists, ascending=True):
if ascending == True: # If in an ascending order
return sorted(sum(lists,[])) # `sum()` merges and `sorted()` sorts it
elif ascending == False: # If in a descending order
return sorted(sum(lists,[]), reverse=True) # `reverse=True` makes it descending
>>> print(merge_sort(list1))
print(merge_sort(list2))
print(merge_sort(list3))
[0, 2, 3, 4, 6, 7, 10, 11]
[0, 1, 2, 3, 4, 6, 7, 10, 11]
[-109, -30, -10, 5, 10, 34, 98, 567, 10001]
>>> print(merge_sort(list1, ascending=False))
print(merge_sort(list2, ascending=False))
print(merge_sort(list3, ascending=False))
[11, 10, 7, 6, 4, 3, 2, 0]
[11, 10, 7, 6, 4, 3, 2, 1, 0]
[10001, 567, 98, 34, 10, 5, -10, -30, -109]
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]
因此你最终得到的列表就是无序的了。