@@СултанЖусупов-б5т В случае когда входной массив имеет нечетную длину, возникает ситуация когда в функцию 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))
Как всегда качество и подача на высоте. Спасибо!
Спасибо большое за это видео. Кратко и ясно. Поймет даже самый далекий
Большое спасибо! Занимаюсь на курсе ООП,на stepik.
Алгоритмы сортировки вдруг понадобились - и тут снова ваша помощь🙂
Просто лучший. За 10 минут научилась большему, чем за 4 года универа. Спасибо
Нефиг было спать на лекциях 😄😀
Отличный преподаватель. Алгоритмы - в плейлист.
Все очень подробно объяснено!👍🏻Пойду пробовать на задачах😊
Хороший подробный разбор.
В коде на видео ошибка. Вот работающий код:
def merge(a,b):
c=[]
i=j=0
while i
можете обьяснить пж в чем именно заключается ошибка
@@СултанЖусупов-б5т В случае когда входной массив имеет нечетную длину, возникает ситуация когда в функцию 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).
можете объяснить как этот код сработал у него? я написал тот же код с теми же данными и получил ошибку
@@Игорь-к9с6к У меня код из видео не работает, его пришлось доработать
@@abramovdenis09 у меня вопрос как он сработал в видео? я запускал его с теми же данными и полностью его повторил и проверил точность повтора, но код не работает. машина ведь не может ошибаться - автор видео получается делал монтаж? других вариантов я не могу придумать
Есть ли в планах делать видео по Django?
Отличное видео. Спасибо.
сделал как на видео но на степике не проходит решение: """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] )
Разве не while i < n or j < m?
отличный ролик, спасибо. Только не b 'йотый', a b 'житый'
Спасибо за видео! Но это самая непонятная тема из трех плейлистов: основы, ооп, алгоритмы и структуры данных
4:00 А куда делать пятёрка?)
Очень крутое видео!
У меня все работает. Если у кого-то не работает, проверьте свой код, скорее всего какой-то символ пропущен или написан с ошибкой...
вау, прочитал около 3 статей, ничего не понял. Ваше видео шедевр, вялiкi дзякуй)
Со слиянием списков все понятно, но как списки отсортировались в процессе разбиения рекурсией вообще не могу понять. Кто-нибудь может скинуть ссылку где это можно прочитать?
ты слияешь 2 элемента! они в этот момент и сортируются, а далее у тебя 2 списка каждый из 2 отсортированых и т.д. в итоге все соединились и отсортировались
спасибо!
Вот иногда думаю, как до этого можно было догадаться самому?
Снова не могу понять, почему бы не решить merge_two_list() через popы А[0] и В[0], с добавлением в С?
Django
Не понял. В какой момент происходит сортировка списка? Если например в левой части списка идут числа 3, 1,...то как в списке они окажутся в правильной последовательности?
в merge_two_list, когда в списках остаются по одному элементу, они сравниваются и упорядоченно сливаются в новый список С.
если его можно отсортировать слиянием, то можно просто соединить срез l[0] и l[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))
а теперь напишите это на Си)
для чего нужна переменная n? n = int(input()) ни где не участвует
А если брать минимум и список перезаписывать с исключением его
наитупейшая задача
У меня почему то выводит 1 1 3 4 5 ( массив 5 4 3 2 1). Почему?
Для питонистов указатели лишь вспомогательный инструмент в некоторых алгоритмах, а вот для c++ программистов...