这是我的合并排序的python实现:
def sort(lst):
if len(lst) < 2:
return lst
def merge(left, right):
i = j = 0
merged = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
return merged
middle = len(lst) / 2
return merge(sort(lst[:middle]), sort(lst[middle:]))
但是,当我使用它时,此实现仅返回包含单个项目的列表 - 列表中的最小项目。
例如,sort([1,2,3])返回[1],sort([4,2,-1,5])返回[-1]。
为什么呢?谢谢。
答案 0 :(得分:2)
你非常接近,你的merge()函数会在一个列表用完后停止,所以你需要将剩下的列表添加到合并列表中:
def sort(lst):
if len(lst) < 2:
return lst
def merge(left, right):
i = j = 0
merged = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
merged.extend(left[i:])
merged.extend(right[j:])
return merged
middle = len(lst) / 2
return merge(sort(lst[:middle]), sort(lst[middle:]))
答案 1 :(得分:1)
问题出在merge()
的循环条件中。一旦你到达两个列表的 的末尾,循环就会停止,而你当然想要两者中的所有元素。如果您尝试单独测试merge()
函数,可以看到这会导致问题:
>>> merge([1, 5], [2, 7])
[1, 2, 5]
您需要确保一旦到达一个列表的末尾,您仍然从另一个列表中复制剩余的元素。
这样做的一种方法是添加另一对循环,在主合并循环之后将left
或right
中的任何剩余元素附加到merged
。