List在递归循环中创建后返回none-type以进行合并排序

时间:2017-08-09 14:12:43

标签: python algorithm list mergesort nonetype

我试图通过自己编写来理解算法。在尝试复制合并排序时,我遇到了一些麻烦:左和右; right return none-type,并在第一个while循环中为len(左)引发错误。我一直在与代码斗争,无法弄清楚我错过了什么?它不应该循环,直到左右列表的大小减少到1,这将允许它们离开if循环并继续函数的下一部分?

def merge_sort(A):

    if len(A) < 2:
        return A
    else:
        mid= len(A)//2
        left= merge_sort(A[:mid])
        right= merge_sort(A[mid:])

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

2 个答案:

答案 0 :(得分:1)

您的函数不包含return语句。你应该在它的最后添加return sortedlist

答案 1 :(得分:1)

您需要做的就是添加一个return语句(下面代码中的最后一个语句):

def merge_sort(A):

    if len(A) < 2:
        return A
    else:
        mid= len(A)//2
        left = merge_sort(A[:mid])
        right = merge_sort(A[mid:])

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

    # NEED TO RETURN THE LIST HERE!
    return sortedlist

如果您的函数未返回任何语句,例如left = merge_sort(A[:mid]),则会将None分配给left,而不是排序(一半)列表。

然后你可以用:

进行测试
import random

lst = list(range(15))
random.shuffle(lst)
ret = merge_sort(lst)
print(ret)