繁体   English   中英

合并排序问题-Python

[英]Merge Sort Problems - Python

我的代码有什么问题? 它仅输出vect值的一部分。 似乎while循环在某个时刻中断。 我不明白为什么。

def print_list(vect):
    for i in range(0, len(vect)):
        print(vect[i])

def merge_sort(vect):
    left = []
    right = []    
    result = []

    for i in range(0, int(len(vect)/2)):
        left.append(vect[i])
    for i in range(int(len(vect)/2), len(vect)):
        right.append(vect[i])

    left.sort()
    right.sort()
    i = 0
    j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    print(len(result))
    return result

vect = [3, 1, 5, 7, 10, 2, 0]

vect = merge_sort(vect)

好吧,你的错误是你的while循环之后

while i < len(left) and j < len(right):
  ...

i < len(left)j < len(right)可能是(而且很可能是j < len(right) ,因此您需要在答案后面加上适当部分的后缀。 这很容易做到

result += left[i:]
result += right[j:]

说明:

想象一下合并过程:您在开始时将i和j设为0,然后在每一步中都将它们之一向前移动。 什么时候停止? 当其中之一到达终点时。 假设我已经结束了。 因此,您将整个左侧部分添加到了结果中,但是j和len(right)之间的右侧仍然有一些元素,因此您也必须将它们添加到答案中。

台面

您正在执行合并排序,所以请

left = merge_sort( left )
right = merge_sort( right )

代替

left.sort()
right.sort()

注意:您必须在合并功能开始时在代码中添加以下检查,以避免无限递归:

if len( vect ) == 1:
   return vect

同样在print_list函数中,您可以使用

print vect

或至少

for x in vect
print x

一旦左侧或右侧耗尽,while循环就会退出。 这使未用尽列表中剩余的所有元素都不会合并。

将代码更改为此:

def print_list(vect):
    for i in range(0, len(vect)):
        print(vect[i])

def merge_sort(vect):
    left = []
    right = []

    result = []
    for i in range(0, int(len(vect)/2)):
        left.append(vect[i])
    for i in range(int(len(vect)/2), len(vect)):
        right.append(vect[i])

    left.sort();
    right.sort();
    i = 0
    j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    if i < len(left):
        result.extend(left[i:])
    else:
        result.extend(right[j:])

    print(len(result))
    return result

vect = [3, 1, 5, 7, 10, 2, 0]

vect = merge_sort(vect)
print vect

如果您在左右使用sort方法,那么为什么您不只在整个列表中使用它,我有点困惑。 但是我想你有你的理由。 :)

编辑:我把整个代码块放在那里,以便您可以看到它。 当我运行此命令时,它会打印[0,1,2,3,5,7,10],这是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM