#13. Быстрая сортировка Хоара | Алгоритмы на Python

แชร์
ฝัง
  • เผยแพร่เมื่อ 14 ต.ค. 2024
  • Рассказывается об одном из самых популярных алгоритмов быстрой сортировки массивов по Хоару. Приводятся особенности его работы и возможность сортировать непосредственно в исходном массиве. Представлена программа на языке Python.
    algorithm-quick-sort.py: github.com/sel...

ความคิดเห็น • 34

  • @dimakovalenkov7835
    @dimakovalenkov7835 3 ปีที่แล้ว +54

    1. рассказать про преимущества сортировки без создания дополнительных списков
    2. создать по 3 списка на каждую итерацию(тремя циклами)

    • @ДмитрийПименов-ж5ш
      @ДмитрийПименов-ж5ш ปีที่แล้ว +2

      вот пример с сортировкой на месте
      from random import randint
      def partition(array: list, left: int, right: int) -> int:
      rand = randint(left, right)
      array[rand], array[left] = array[left], array[rand]
      x = array[left]
      j = left
      for i in range(left + 1, right + 1):
      if array[i] None:
      if left < right:
      m = partition(array, left, right)
      quick_sort(array, left, m - 1)
      quick_sort(array, m + 1, right)

    • @АлексейЛевицкий-ъ5ф
      @АлексейЛевицкий-ъ5ф 11 หลายเดือนก่อน +1

      @@ДмитрийПименов-ж5ш Спасибо

  • @friend1cat
    @friend1cat 3 ปีที่แล้ว +9

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

  • @СергейНауменко-ь6н
    @СергейНауменко-ь6н ปีที่แล้ว +2

    Очень доходчиво и интересно спасибо Вам за труды

  • @rostislavmalyshev1775
    @rostislavmalyshev1775 3 ปีที่แล้ว +3

    Спасибо. Как всегда The Best!

  • @Яська_Гаспадар_з-пад_Вільні
    @Яська_Гаспадар_з-пад_Вільні 3 ปีที่แล้ว +3

    Благодарю за материал!

  • @deniskrepak
    @deniskrepak 3 ปีที่แล้ว +2

    Очень понятно объясняете, спасибо Вам!

  • @mustafinabulhairc-0kn286
    @mustafinabulhairc-0kn286 ปีที่แล้ว +2

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

  • @МихаилПеров-у1ю
    @МихаилПеров-у1ю ปีที่แล้ว +1

    Спасибо!!!

  • @sevakvart1111
    @sevakvart1111 3 ปีที่แล้ว +3

    Хороший урок

  • @zwerg6406
    @zwerg6406 2 ปีที่แล้ว +4

    А почему при сортировке на месте остались 2 последних элемента неотсортированы? [...10, 2]

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +2

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

    • @dvkonstantinov
      @dvkonstantinov 2 ปีที่แล้ว

      @@selfedu_rus Нет, дело тут не в указателе. Нужно рекурсию вызывать

  • @ЕрвандАгаджанян-в3к
    @ЕрвандАгаджанян-в3к 2 ปีที่แล้ว +2

    Спасибо огромное!
    А разве Python реализован не на C? Если мы говорим о реализации CPython. Почему вы говорите о C++?
    Расскажите, пожалуйста, это интересно.

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +3

      Я, конечно, сам язык не разрабатывал )) но думаю, что его все-таки на С++ делали, т.к. сделать такую вещь без ООП - это подвиг )

  • @НикитаХлобыстов-г2й
    @НикитаХлобыстов-г2й 4 หลายเดือนก่อน +1

    а как случайный выбор должен помочь ускорить процесс сортировки. Если случайный выбор будет все попадать на самые малые значения в "гиперсписках", то максимальная сложность все равно будет оN^2

    • @selfedu_rus
      @selfedu_rus  4 หลายเดือนก่อน

      Все верно, но вероятность такого события крайне мала.

  • @trampika2013
    @trampika2013 2 ปีที่แล้ว +1

    thanks

  • @СергейКондулуков-з9ч
    @СергейКондулуков-з9ч ปีที่แล้ว +1

    Не очень понял но интересно.

  • @sergeyv1534
    @sergeyv1534 3 ปีที่แล้ว +1

    В качестве идеи - дополнить цикл лекций разбором применения метода list.sort() и функции sorted(list) с ключами.

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว +2

      Это уже есть: th-cam.com/video/uvlKcOS4OQw/w-d-xo.html

    • @sergeyv1534
      @sergeyv1534 3 ปีที่แล้ว

      @@selfedu_rus Упс, проглядел.

  • @alenazhukova8175
    @alenazhukova8175 3 หลายเดือนก่อน +1

    Здесь не происходит inplace сортировки

  • @Борис-ц6ю6ж
    @Борис-ц6ю6ж 2 ปีที่แล้ว +2

    без рекурсии тоже работает
    def f_sort(l):
    if len(l) l[0]]

    return left + center + right

    • @medencev
      @medencev 2 ปีที่แล้ว

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

    • @ymnop9652
      @ymnop9652 ปีที่แล้ว

      Как и сказали выше, рекурсия сортирует левый и правый массивы, без неё мы можем соединить левый неотсортированный, средний, и правый неотсортированный. пример: [3,2,5,8,7,1] где значение с которым сравниваем - 5 получим L = [3, 2, 1] M = [5] R = [8, 7], L + M + R = [3, 2, 1, 5, 8, 7]

  • @dmitrypenzar5229
    @dmitrypenzar5229 3 ปีที่แล้ว

    быстрой сортировкой это не является (код, что написан). Это штука по логике будет медленнее по-человечески написанной MergeSort

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว

      Реализация на Python, конечно, медленнее, чем на С++. Здесь объясняется лишь алгоритм сортировки, не более того.

    • @dmitrypenzar5229
      @dmitrypenzar5229 3 ปีที่แล้ว +1

      @@selfedu_rus проблема не в Python, а в том, как вы на нем написали. У Qsort вся идея в том, что вам НЕ нужно заводить дополнительную память

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว

      @@dmitrypenzar5229 Это да, я согласен! Ну, идея изложена, реализовать - дело техники )

    • @ymnop9652
      @ymnop9652 ปีที่แล้ว

      @@dmitrypenzar5229Но ведь на Left, MIddle, Rigth память в любом случае уйдёт?

  • @AnatoliyDekorstyle
    @AnatoliyDekorstyle 11 หลายเดือนก่อน

    Вообще конечно реализация "Быстрых сортировок" массива через рекрсию - звучит даже смешно)) максимальная глубина рекурсии (по дефолту ~1000) не позволит сортировать массив с N выше 1000. То есть какие сотни тысяч или милионы)) Скорее упрощенная визуализация алгоритма...

    • @ekzzyy
      @ekzzyy 9 หลายเดือนก่อน

      Разве? Глубина рекурсии в быстрой сортировке будет немного больше чем log2(N), что позволяет сортировать массивы под 2^1000, если брать 1000 за глубину рекурсии.
      Если я ошибаюсь, то поясните, пожалуйста.