Список не возвращает тип после создания в рекурсивном цикле для сортировки слиянием

Я пытаюсь понять алгоритмы, пишу их сам. При попытке воспроизвести сортировку слиянием я столкнулся с некоторыми проблемами: левый и правый возвращают значение none-type, и возникает ошибка для len(left) в первом цикле while. Я боролся с кодом и не мог понять, что мне не хватает? Разве он не должен просто зацикливаться до тех пор, пока размер левого и правого списков не уменьшится до 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))

person Ai coding ai    schedule 09.08.2017    source источник
comment
просто нужно немного разобраться с отступом   -  person ragardner    schedule 09.08.2017
comment
О, с отступом обычно все в порядке, я не знаю, почему в вопросе это получилось так. Я отредактирую!   -  person Ai coding ai    schedule 09.08.2017


Ответы (2)


все, что вам нужно сделать, это добавить оператор возврата (последний оператор в приведенном ниже коде):

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)
person hiro protagonist    schedule 09.08.2017
comment
Когда я добавляю оператор return, функция ничего не возвращает, даже ошибку. - person Ai coding ai; 09.08.2017
comment
в функции нет оператора печати. функция действительно что-то возвращает; просто ничего не печатается. добавил фрагмент того, как вы можете проверить свою функцию сортировки. - person hiro protagonist; 09.08.2017
comment
Дополнительный код, который вы написали, работает, но в конце функции есть оператор печати. ​​Есть идеи, почему он не работает сам по себе? - person Ai coding ai; 09.08.2017
comment
в функции в моем ответе нет оператора печати ... ваш после оператора возврата? в этом случае он никогда не будет выполнен. - person hiro protagonist; 09.08.2017

Ваша функция не содержит оператора возврата. Вы должны добавить return sortedlist в конце.

person clemens    schedule 09.08.2017
comment
Добавил оператор return, но функция ничего не возвращает. - person Ai coding ai; 09.08.2017
comment
Он печатает список? - person clemens; 09.08.2017
comment
Нет, он даже не печатает список. - person Ai coding ai; 09.08.2017