@@user-ij4rv9yi7s В случае когда входной массив имеет нечетную длину, возникает ситуация когда в функцию merge_two_list, приходят массивы разной длины к примеру a = [5], b = [7,9] в этом случает в цикле отработает условие a[i] < b[j] для [5], затем после цикла сработает условие if j < len(b), НО только для [7], из-за чего в результате потеряется 9. Для этого необходимо перебирать все элементы в массиве не прошедшем проверку внутри while - для этого вводятся еще два цикла while i < len(a) вместо if i < len(a) и while j < len(b) вместо if j < len(b).
@@abramovdenis09 у меня вопрос как он сработал в видео? я запускал его с теми же данными и полностью его повторил и проверил точность повтора, но код не работает. машина ведь не может ошибаться - автор видео получается делал монтаж? других вариантов я не могу придумать
сделал как на видео но на степике не проходит решение: """Traceback (most recent call last): File "jailed_code", line 53, in assert merge_sort([11, 15, 19, 20, 20, 6, 4, 16, 8]) == [4, 6, 8, 11, 15, 16, 19, 20, 20], "Функция merge_sort возвращает неправильный результат" AssertionError: Функция merge_sort возвращает неправильный результат"""
Скорее всего не актуально, но ты, видимо, забыл 'left' и 'right' обернуть в рекурсию: left = merge_sort( lst[middle : ] ) right = merge_sort( lst[ : middle] )
Со слиянием списков все понятно, но как списки отсортировались в процессе разбиения рекурсией вообще не могу понять. Кто-нибудь может скинуть ссылку где это можно прочитать?
ты слияешь 2 элемента! они в этот момент и сортируются, а далее у тебя 2 списка каждый из 2 отсортированых и т.д. в итоге все соединились и отсортировались
Не понял. В какой момент происходит сортировка списка? Если например в левой части списка идут числа 3, 1,...то как в списке они окажутся в правильной последовательности?
Решил задачу, но лишь немного изменил входные данные в функцию, в pycharme всё норм получается, но на степике не принимает решение, не понимаю в чем проблема # функция merge_two_list должна объединить два списка def merge_two_list(a, b): c=a+b r=[] while len(c)!=0: r.append(min(c)) c.remove(min(c)) return r # функция merge_sort должна выполнить сортировку def merge_sort(s,N): if len(s)==1: return s else: a = merge_sort(s[:(N//2)],N//2) b = merge_sort(s[(N//2):],N-N//2) return merge_two_list(a, b) N = int(input()) s = list(map(int,input().split())) print(merge_sort(s,N))