Member 14511889 Ответов: 3

Понимая это реализация сортировка слиянием на языке Python


Я пытаюсь понять этот код, который я нашел в интернете, однако я не могу понять его, потому что что-то сбивает меня с толку. Как вы можете видеть ниже, я поставил звездочку на запутанной части. В *1 он рекурсивно запускает функцию "merge_sort", так как же в *2 он может возвращать функцию "merge".Я бы отя думал, что компилятор не может запустить *2 из-за рекурсивного вызова в списке 1*.

пожалуйста, не мог бы кто-нибудь объяснить мне, как это работает, потому что я не могу прогрессировать дальше, пока не узнаю, как это работает.

Что я уже пробовал:

def merge_sort(array):

    if len(array) <= 1:
        return array

    midpoint = int(len(array) / 2)

    *1 left, right = merge_sort(array[:midpoint]), merge_sort(array[midpoint:])

    *2 return merge(left, right)


def merge(left, right):
    
    result = []
    left_pointer = right_pointer = 0

    while left_pointer < len(left) and right_pointer < len(right):

        if left[left_pointer] < right[right_pointer]:

            result.append(left[left_pointer])
            left_pointer += 1

        else:

            result.append(right[right_pointer])
            right_pointer += 1

    result.extend(left[left_pointer:])
    result.extend(right[right_pointer:])

    return result

3 Ответов

Рейтинг:
2

Richard MacCutchan

Посмотрите на первые две строки метода merge_sort:

if len(array) <= 1:
    return array

В какой-то момент метод вернется и упадет до последней (*2) строки метода.

Добавьте некоторые (очень маленькие) тестовые данные и несколько операторов печати, и вы сможете точно увидеть, что он делает.


CPallini

5.

Рейтинг:
2

CPallini

Ричард я уже дал вам правильный ответ. Во всяком случае, взгляните на это. Как работает рекурсия — объяснено с помощью блок-схем и видео[^].


Рейтинг:
0

Patrice T

Цитата:
Я пытаюсь понять этот код, который я нашел в интернете, однако я не могу понять его, потому что что-то сбивает меня с толку.

Вы можете посмотреть здесь: Сортировка слиянием - Википедия[^], есть немного анимации.

В противном случае вы можете выполнить код с помощью отладчика :
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


CPallini

5.

Patrice T

Спасибо за намерение, но вы уверены, что сделали это ? :)

CPallini

УПС :-О
Теперь исправлено.

Patrice T

:) Спасибо