关于python:List在合并排序的递归循环中创建后返回none-type

List returns none-type after creation in recursive loop for merge sort

我试图通过自己写算法来理解它们。在尝试复制合并排序时,我遇到了一些问题:Left&Right返回无类型,并且在第一个while循环中为len(左)引发了一个错误。我一直在和代码作斗争,却不知道我遗漏了什么?它不应该只是循环直到左、右列表的大小减小到1,这将允许它们退出if循环并继续函数的下一部分吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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))


您只需添加一个返回语句(下面代码中的最后一个语句):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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而不是排序(一半)列表。

然后你可以用以下方法来测试它:

1
2
3
4
5
6
import random

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


您的函数不包含返回语句。你应该在末尾加上return sortedlist