为什么我的python合并排序实现只返回一个包含最小项的单例列表?

时间:2012-01-08 03:30:31

标签: python algorithm

这是我的合并排序的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]。

为什么呢?谢谢。

2 个答案:

答案 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]

您需要确保一旦到达一个列表的末尾,您仍然从另一个列表中复制剩余的元素。

这样做的一种方法是添加另一对循环,在主合并循环之后将leftright中的任何剩余元素附加到merged