#9. Сортировка вставками | Алгоритмы на Python

Sdílet
Vložit
  • čas přidán 28. 02. 2021
  • Узнаете как работает алгоритм сортировки вставками и в чем его ключевое отличие от алгоритма сортировки выбором. Приведена реализация рассматриваемого алгоритма на Python.
    algorithm-sort-inserts.py: github.com/selfedu-rus/python...

Komentáře • 53

  • @user-cc1qp6hd9b
    @user-cc1qp6hd9b Před 2 lety +28

    Сергей, спасибо вам огромное за ваш труд ! Человечество держится на таких людях как вы, которые безвозмездно помогают другим, ваш вклад в обучение неоценим!)

  • @nazarkhort4362
    @nazarkhort4362 Před 3 lety +22

    лучшее из объяснений данной темы на ютюбе, я не преувеличиваю

  • @timur8216
    @timur8216 Před 3 lety +10

    Огромное спасибо Вам!
    Максимально понятно объясняете, ждем продолжение по алгоритмам!)

  • @mrfang5908
    @mrfang5908 Před 2 lety +2

    спасибо полезный алгоритм + очень простая подача, Жду от вас рекурсии, хеш и деревья, очень интересно посмотреть

  • @user-qh5fr3yo1w
    @user-qh5fr3yo1w Před rokem +1

    Очень хорошее объяснение алгоритма. Сергею большое спасибо.

  • @user-dy8sc3bp8o
    @user-dy8sc3bp8o Před 2 lety +26

    Пересмотрел несколько раз, и все равно мне кажется что это не сортировка вставками а модифицированный "пузырёк" с реверсом во вложенном цикле, так как вы сравниваете элементы j и j -1 .
    По идее при сортировке вставками сравниваем i-й элемент и продвигаемся с проверкой условия к 0 элементу, если условие срабатывает то забираем элемент с позиции i и вставляем на позицию j на которой сработало условие, при этом если ранее сортированные элементы просто сдвигаются.
    Именно сортировка вставками в моём понимании ( в питоновском стиле) может выглядеть так:
    for i in range(1, len( list )):
    for j in range(i - 1, -1, -1):
    if list[ i ] < list[ j ]:
    continue
    else:
    j += 1
    break
    if list[ j ] > list[ i ]:
    list.insert(j, list.pop(i))
    поправьте, если я ошибся

    • @ladogaspirit9953
      @ladogaspirit9953 Před 2 lety +4

      тоже так подумалось при просмотре

    • @usernoname-wv6of
      @usernoname-wv6of Před rokem

      Можно без инсерта сделать вполне.
      for i in range(1, len(array)):
      key = array[i]
      j = i - 1
      while j >= 0 and key < array[j]:
      array[j + 1] = array[j]
      j -= 1
      print(array) - Этот принт покажет что происходит со списком. По факту элемент, который будет вставлен на свое место хранится в key. В это время проходимся по списку и сдвигаем каждый элемент, который больше key вправо на +1 (если вставлять так n элементов, то на +n)
      array[j + 1] = key

  • @reasonableengine
    @reasonableengine Před 2 lety +1

    Большое спасибо за популярное объяснение!

  • @user-pw4cq7cp8v
    @user-pw4cq7cp8v Před 3 lety +1

    Спасибо за визуальное объяснение.

  • @user-ux1ev4cx1w
    @user-ux1ev4cx1w Před 10 měsíci +1

    Отличное объяснение!) Спасибо огромное)

  • @friend1cat
    @friend1cat Před 3 lety +3

    Спасибо, Сергей!

  • @nikitun85
    @nikitun85 Před rokem +5

    Все очень круто! Безусловно лайк. Но было бы неплохо хотя бы в двух словах акцентировать внимание на разнице с уже объясненными подходами. Когда разбираешься в этом первый раз, это не всегда очевидно. Первая моя мысль после этого видео была о том, что методы суть одно и то же, только идут по массиву в разных направлениях. Один из начала в конец, другой из конца в начало.

  • @WadeChannal
    @WadeChannal Před rokem +2

    Самое понятное объяснение из всех что я видел

  • @lukasmog777
    @lukasmog777 Před 2 lety +1

    Топ объяснение! Спасибо!

  • @antonivanov7687
    @antonivanov7687 Před 2 lety +2

    Спасибо, это лучше объяснение

  • @mma_lina
    @mma_lina Před 6 měsíci +3

    не понял в чем различие этой сортировки от пузырька(в коде), потому что по сути так же меняем два соседних элемента. Когда сортировка вставкой подразумевает немного другое.

  • @kirillguryanov4925
    @kirillguryanov4925 Před 8 měsíci +1

    спасибо большое!

  • @ChibiPipa
    @ChibiPipa Před 3 lety +3

    У меня через 3,5 часа экзамен начнётся, на котором будет билет с вопросом по методам сортировок.
    Спасибо Вам большое за видео

  • @user-yp6yv2ub2u
    @user-yp6yv2ub2u Před rokem +1

    Сергей, вам следует заняться преподаванием. Огромное спасибо.

  • @user-ft9sd1gj4g
    @user-ft9sd1gj4g Před 2 lety +1

    спасибо!

  • @___12_37
    @___12_37 Před rokem +1

    спасибо

  • @user-gu1eo9oy1y
    @user-gu1eo9oy1y Před 3 měsíci +1

    Вітаю, контент супер , але було б крутіше , щоб назви змін відповідали їх суті бо j та i заплутує навіть в такому простому на перший погляд алгоритмі

  • @jamjam3337
    @jamjam3337 Před rokem +1

    👏👍

  • @ubengaus
    @ubengaus Před rokem +1

    За видео и труды однозначно лайк! Мне вот не совсем понятно, зачем блок else? Ведь если if дает False, то и так перейдем не следующую итерацию цилка с j.

  • @ANONIM_KA289
    @ANONIM_KA289 Před rokem +1

    Имеется массив целых чисел a[1],...,a[n], принимающих значения {0,1,....,m}.Сортировать этот массив по возрастанию , используя количество действий порядка (m + n). Указание: Посчитать сколько раз каждое из чисел {0,1,....,m} встречается в массиве.
    Кто знает подскажите какой алгоритм сортировки тут применять ?

  • @user-gc6jr7ev5u
    @user-gc6jr7ev5u Před 2 lety +1

    Как сделать такой же код на C# ?

  • @donfedor007
    @donfedor007 Před rokem +3

    Вроде всё понятно, начинаю сам повторять не понимаю((( не как в голове не могу представать как это прорабатывается.

  • @workout3D
    @workout3D Před 7 měsíci +1

    Я так и не понял, в каком месте кода определяется, с каким начальным отсортированным подмассивом мы будем работать. По идее, чем больше элементов в начале стоит по порядку, тем меньше должно быть итераций, разве нет? Но количество итераций не меняется даде если подставить полностью отсортированный массив в а. Будет точно также сравниваться второй элемент с первым и т.д.

  • @musecollaboration
    @musecollaboration Před 6 měsíci +1

    можно же вместо break использовать continue?
    l = [10, 7, 8, 3, 8, -2]
    n = len(l)
    for run in range(1, n):
    for i in range(run, 0, -1):
    if l[i] < l[i - 1]:
    l[i], l[i - 1] = l[i - 1], l[i]
    continue
    print(l)

  • @user-nn5gz8ge1i
    @user-nn5gz8ge1i Před 2 lety +3

    А обезательно else: break писать? Если да, то почему?

    • @user-hh2mi8dp2p
      @user-hh2mi8dp2p Před 2 lety +2

      Писать не обязательно, но это позволяет уменьшить кол-во сравнений (а следовательно и вычислительную сложность алгоритма). Тут else: break дает нам возможность не совершать лишние сравнения в уже отсортированной части массива, поэтому его лучше писать, чем не писать.

  • @sigurds5599
    @sigurds5599 Před 23 dny +1

    Спасибо большое))))

  • @k-065olga8
    @k-065olga8 Před 2 lety +3

    Доброе время суток! Есть еще такой алгоритм сортировки вставками
    a = [5, 2, 4, 6, 1, 3]
    for i in range(1, len(a)):
    temp = a[i]
    j = i - 1
    while (j >= 0 and temp < a[j]):
    a[j + 1] = a[j]
    j = j - 1
    a[j + 1] = temp
    print(*a)
    он ведь сложнее, но почему то именно он описан в книге. Можете объяснить зачем так усложняют некоторые авторы?

    • @selfedu_rus
      @selfedu_rus  Před 2 lety +4

      Наверное эти авторы ранее программировали на С++, Fortran или каком другом подобном языке и формально также продолжают писать и на Python. Сам грешил вначале ))

    • @k-065olga8
      @k-065olga8 Před 2 lety +1

      @@selfedu_rus Спасибо большое за объяснение!!! и за Ваши уроки , в книгах очень мудрят !!!

    • @k-065olga8
      @k-065olga8 Před 2 lety +4

      А еще, смешно получилось. Я нашла Ваши уроки потому, что учусь на платных курсах и нам преподаватель объяснял полтора часа алгоритм КМТ и никто ничего не понял, вот и полезла погуглить)))

  • @froggyt1243
    @froggyt1243 Před 2 lety +1

    здраствуйте а как сделать сортировку ставками но наоборот от большого к меньшему

    • @selfedu_rus
      @selfedu_rus  Před 2 lety

      при слиянии списков формируете последовательности от большего к меньшему и все

  • @SLSRPPRO
    @SLSRPPRO Před 2 lety

    объясните пожалуйста for j in range(i, 0, -1)

    • @selfedu_rus
      @selfedu_rus  Před 2 lety

      см. курс по Python на этом канале

    • @SLSRPPRO
      @SLSRPPRO Před 2 lety +1

      @@selfedu_rus затупил , -1 это же шаг))

  • @Oleg_RZA
    @Oleg_RZA Před 8 měsíci

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

  • @happybunny9685
    @happybunny9685 Před 7 měsíci +1

    Это разве не пузырьковый метод? Я про код

  • @ladogaspirit9953
    @ladogaspirit9953 Před 2 lety

    Зачем это изучается если есть встроенные функции сортировки? На работе не оценят если вместо встроенной функции потратить время на такую реализацию.

    • @selfedu_rus
      @selfedu_rus  Před 2 lety +9

      А кто все это изначально реализовывает? Бог? И что если нужно немного изменить алгоритм или развить?

  • @tbma137
    @tbma137 Před 3 měsíci

    пузырьковая реверс xd

  • @anitar1996
    @anitar1996 Před rokem

    Это метод пузырька, а не вставка....

  • @r1seup127
    @r1seup127 Před 3 lety +3

    Я не совсем понимаю, различия между пузырьком и вставкой, если значение (большее или меньшее передвигается на один, как при пузырьке. Там такое сравнение с соседом, и такое перемещение. Позиция поиска разве что другая. Так почему тогда вставку нельзя назвать пузырьком?

    • @user-pw4cq7cp8v
      @user-pw4cq7cp8v Před 3 lety +3

      Потому что:
      1. Пузырьки уже есть и тот алгоритм более логичен по названию. А называть можете как хотите - частичный пузырек.))
      2. Сложность этого алгоритм по лучшему его времени = n (если алгоритм уже отсортирован на входе, то алгоритм по нему пройдет один раз). В то время, как у пузырька всегда n^2.

    • @ladogaspirit9953
      @ladogaspirit9953 Před 2 lety

      @@user-pw4cq7cp8vпройдет еще раз если использовали break. Если не использовать break то это обратный пузырек

  • @user-yj7cv1bl9r
    @user-yj7cv1bl9r Před 2 lety +3

    Дизлайк сюда:
    👍