Java. Быстрая сортировка. Объяснение на пальцах)

แชร์
ฝัง
  • เผยแพร่เมื่อ 5 ต.ค. 2024
  • Как работает быстрая сортировка и почему она быстрая? Разбор алгоритма и небольшой сравнительный тест производительности.
    Исходники:
    github.com/Arh...
    Поддержать канал💰:
    yoomoney.ru/to...
    #ArhiTutorialsJava #ityoutubersru

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

  • @Qwerty-fn3rf
    @Qwerty-fn3rf 4 ปีที่แล้ว +19

    Спасибо, сколько пересмотрел видео по алгоритмам, у вас прям самое доходчивое объяснение в русском ютубе

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

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

  • @АлексейЖуков-й6ъ
    @АлексейЖуков-й6ъ 3 ปีที่แล้ว +2

    Не думал, что фраза на пальцах ))) была буквальной ))))

  • @UserUser-yk9bt
    @UserUser-yk9bt 7 หลายเดือนก่อน +1

    Спасибо! Интересный пример)

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

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

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

    я видел алгоритмы на youtube, но таких подробных глубоких разборов, как у вас на других каналах нет

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

    Спасибо большое за объяснение, всё очень доходчиво, спасибо за ваш труд!)

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

    Спасибо! Очень доступно объясняете.

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

    Супер! Сергей, спасибо за показательное сравнение Quick sort and Bubble sort! Получилось очень наглядно!

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

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

  • @АнтонХрущев-ц7ш
    @АнтонХрущев-ц7ш 3 ปีที่แล้ว +5

    Там где идёт первое спнение на меньше , сравнивается элемент сам с собой на меньше и соответственно даст фолс и не зайдет в блок - инкрементация не произойдет и пиздец ...спасибо !!

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

      вот тоже долго не мог понять, думал может я что-то не догоняю

  • @ДмитрийСамсонов-я2о
    @ДмитрийСамсонов-я2о ปีที่แล้ว

    Отлично! Очень похоже на бинарный поиск)

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil ปีที่แล้ว

      я бы не сказал, бинарный поиск работает уже на сортированом массиве

    • @ДмитрийСамсонов-я2о
      @ДмитрийСамсонов-я2о ปีที่แล้ว

      @@Das.Kleine.Krokodil тем не менее сходство есть

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil ปีที่แล้ว

      @@ДмитрийСамсонов-я2о сходство в том что относится к семейству алгоритмов "Разделяй и властвуй"

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

    лучшее видео

  • @StarLiNe-ji5nf
    @StarLiNe-ji5nf ปีที่แล้ว

    Спасибо!

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

    Супер!

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

    Неудачно выбрал индекс опорного элемента. Долго не мог понять твой код, особенно первый рекурсивный вызов с to который меньше from и первый while. Взял бы pivot[l + r] , было бы гораздо понятнее

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

    Очень полезно

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

    Sergey ti krasavchik

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

    Огромное спасибо! все более чем понятно. Можно вопрос, я вот у вас случайно увидел метод (measureTime()), который подсчитывает время работы алгоритма. Не могли бы вы пожалуйста показать код метода, хотелось бы посмотреть подробнее. Спасибо.

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

      Конечно.
      private static void measureTime(Runnable task) {
      long startTime = System.currentTimeMillis();
      task.run();
      long elapsed = System.currentTimeMillis() - startTime;
      System.out.println("Затраченное время: " + elapsed + " ms");
      }
      Тут просто запоминаем время до начала выполнения, потом выполняем task.run(), потом берем время после окончания выполнения task.run() и печатаем разницу.
      Удобно, так как можно один раз написать такой метод, а потом измерять им все что угодно)

    • @tomkyte6990
      @tomkyte6990 5 ปีที่แล้ว +1

      Спасибо еще раз! действительно удобно и универсально. Я написал что-то похожее, но у вас получилось интереснее.

  • @audiobooks_with_translation
    @audiobooks_with_translation 8 หลายเดือนก่อน +1

    У меня на этом коде получился такой результат:
    Случайный массив
    Быстрая сортировка: 9367 ms
    Сортировка слиянием: 10961 ms
    Отсортированный массив
    Быстрая сортировка: 3048 ms
    Сортировка слиянием: 4780 ms
    Получилось, что разница между быстрой сортировкой и сортировкой слиянием практически никакой и этот результат стабилен.

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

    Код в примере перестаёт корректно сортировать неотсортированный массив если опорный индекс указать ( from + (to - from) / 2 ).

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

    11:55 Расскажите, пожалуйста, почему вычисляем индекс среднего элемента по такой формуле, а не просто (from + to) / 2? В чём хитрость?

    • @denisthestudent
      @denisthestudent 10 หลายเดือนก่อน

      (from + to) может вылезти за диапазон допустимых значений int-а (максимальный_int = 2147483647). Например если from будет 2*10^9, а to будет 2,1*10^9

  • @achillesofficial15
    @achillesofficial15 4 ปีที่แล้ว

    Спасибо за видео, очень полезное) сталкивался в интернете с информацией, что если много одинаковых элементов, то нужно разделять массив на 3 части. Для меньших, для больших и для равных значений. В данном коде так же нужно, или перестановка решает эту проблему?

  • @John.Constantine.777
    @John.Constantine.777 5 หลายเดือนก่อน

    не стоит делать while (pivot > data[start + (end - start)] / 2)
    в ряде случаев приведет к бесконечному циклу

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

    thanks

  • @nikfunnypro1819
    @nikfunnypro1819 4 ปีที่แล้ว

    Хорошее видео, очень подробно) Может и банальный вопрос, но что посоветуешь прочитать на этапе «уже не новичок, но и не среднячок»)))

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว

      Сложно сказать. А что уже читали?)

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil ปีที่แล้ว

      ищи хорошие лекции вузовские

  • @MrMoshell
    @MrMoshell 4 ปีที่แล้ว

    Хорошее объяснение. Но зачем Вы изобретаете велосипед в виде метода arraysToString? есть же Arrays.toString(array)

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

      Да, есть у меня такая проблема. Память не очень, видимо это последствия работы в IT)
      th-cam.com/video/PveuJ8hy_qg/w-d-xo.html

  • @Scruner-7
    @Scruner-7 3 ปีที่แล้ว

    А почему тест подробнее не объясняете, что за метод measureTime()? Откуда он, у меня идея его не принимает?

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

    Сергей, а в чём смысл рекурсивно делить массив на подмассивы? Я так и не понял. Я прочитал Адитью с его гроканием алгоритмов, так он связывал это со стеком вызовов, типа стек короче получается. Хочется спросить, и шо? Короче, и что из этого? И почему подмассивы обрабатываются параллельно, если в конечном итоге рекурсией всё вызывается последовательно?

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

      После первого разделения из одного массива получаем два. Эти два массива сортируются независимо друг от друга .То есть получаем две независимые задачи по размеру меньше чем исходная.
      Сортировать два маленьких массива - это быстрее чем один большой.
      Пусть исходный массив длинной 100 элементов, мы поделили его на 2 массива по 50 элементов и положим для примера, что мы используем алгоритм сортировки с временной сложностью O(n^2).
      Итого имеем
      сортировка целого массива:
      100^2 = 10000 условных операций
      сортировка двух половинок массива:
      50^2 + 50^2 = 5000 условных операций
      Таким образом, разделение массива на две части ускорило сортировку в 2 раза.
      А быстрая сортировка продолжает делить массивы дальше, по этому выигрыш еще больше.

    • @runrunning4359
      @runrunning4359 2 หลายเดือนก่อน

      ​@@arhitutorials вы уверены что два подмассива сортируются параллельно?

    • @arhitutorials
      @arhitutorials  2 หลายเดือนก่อน

      @@runrunning4359 в этом алгоритме ничего параллельно не обрабатывается.

  • @sainthentai7763
    @sainthentai7763 4 ปีที่แล้ว +1

    Я читаю Стивена Родса Алгоритмы и структуры данных Теория и практика. А так же смотрел видео от Гарварда про быструю сортировку и я могу сказать что есть множество способов реализовать данный алгоритм. Твой более понятный так как он подкреплен кодом и объяснениями со стороны человека по отношению кода. Дальше я могу нарисовать приблизительный рисунок работы данного алгоритма.

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

    Подскажите а если я хочу реализовать крайний правый то что я должен изменить в вашем исходнике?

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

    Привет. Интересное видео, но не мог бы ты подсказать, что делать если нужна вариация быстрой сортировки, которая делиться на три массива. Был бы очень благодарен.

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil ปีที่แล้ว

      зачем именно такая нужна?

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

      @@Das.Kleine.Krokodil не помню уже, год назад было нужно для курсовой

  • @mkrugl
    @mkrugl 4 ปีที่แล้ว

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

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

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

    • @mkrugl
      @mkrugl 4 ปีที่แล้ว

      Sergey Arkhipov благодарю вас за мотивационный пендель 😸!

    • @jeoparrdy
      @jeoparrdy 4 ปีที่แล้ว +1

      числа Фибоначчи не стоит искать при помощи рекурсии. Это очень не эффективный алгоритм. Для поиска 100-го числа Фибоначчи при помощи рекурсии понадобится около 50 000 лет))

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

      @@jeoparrdy сам подщитал?

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

      @@MsDima9999 можешь сам проверить

  • @funnymoment9164
    @funnymoment9164 4 ปีที่แล้ว

    Привет. Спасибо за видео.
    Сколько у тебя лет опыта в Android разработке и вообще в программировании?

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

      Привет. В программировании лет 15. В Android разработке где-то 9 лет. До андроида немного писал на c++, по большей части занимался web-разработкой. Web мне не понравился, так как верстка - это скучно, js фреймворки учить - неблагодарное занятие) По этому перешел на android и доволен.

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

      @@arhitutorials Круто. Спасибо, что делишься своими знаниями.

    • @funnymoment9164
      @funnymoment9164 4 ปีที่แล้ว

      @@arhitutorials Сергей, а насколько сейчас высокие требования для Junov в Android разработке?

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว +7

      @@funnymoment9164 знания это такая вещь, если ими делишься, у тебя от этого меньше не становится. По этому сам делюсь и других призываю к этому)

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว +1

      @@funnymoment9164 Требования достаточно высокие. Часто дают тестовое задание сделать небольшое приложение, которое взаимодействовало бы с сервером через RESTful API и отображало приличный пользовательский интерфейс. Еще требуют применить какой-нибудь архитектурный паттерн типа Model-View-Presenter или Model-View-ViewModel. Часто просят знание языка Kotlin, что большой проблемой не является.
      В общем, прежде чем устраиваться, надо самостоятельно написать хотя бы парочку приложений, чтоб получить хорошее представление, как оно работает и из чего состоит.

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

    никого не смущает while в while и соответственно сложность n^2?

    • @runrunning4359
      @runrunning4359 2 หลายเดือนก่อน

      Я не уверен, но тут циклы идут Последовательно, а не один в другом.

    • @mblngv
      @mblngv 2 หลายเดือนก่อน

      @@runrunning4359 while(leftIndex pivot)} вот эти 2 вайла лежат еще в одном вайле - какая сложность будет?????

  • @yuralakey7120
    @yuralakey7120 4 ปีที่แล้ว

    Здравствуйте, а скажите пожалуйста, как у вас получается открывать массив в консоле пошагово, у меня только мой массив и отсортирован. Буду очень благодарен.

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

      Для этого служит функция, которая есть в исходниках
      github.com/Arhiser/java_tutorials/blob/master/src/ru/arhiser/sort/QuickSort.java
      Функция:
      private static void printSortStep(int[] arr, int from, int to, int partitionIndex)
      Ее надо вызвать в основной функции сортировки quickSort после строки
      int divideIndex = partition(arr, from, to);
      передать в нее состояние на текущем шаге
      printSortStep(arr, from, to, divideIndex)
      а она уже все напечатает.

    • @yuralakey7120
      @yuralakey7120 4 ปีที่แล้ว

      @@arhitutorials Спасибо огромное. Мне как новичку, очень помогают ваши уроки и ваши ответы.

  • @user-segadev
    @user-segadev 2 ปีที่แล้ว

    15.10.2022

  • @HowItWorks
    @HowItWorks 5 ปีที่แล้ว

    Было интересно. Но смотрю, что сортировками упарывается всего 180 человек. :)

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

    эту сортировку я знаю

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

    Сложновато)

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

    Код непонятный.

  • @sainthentai7763
    @sainthentai7763 4 ปีที่แล้ว +1

    Я тут посмотрел на пару алгоритмов реализации быстрой сортировки и заметил кое что странное, почему сравнение идет по отношению индексов ? Короче почему мы на 45 строчке мы написали так if ( left_Index

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว

      if (leftIndex pivot) {
      rightIndex--;
      }

    • @MrSBFI
      @MrSBFI 4 ปีที่แล้ว +1

      ​@@arhitutorials так по этому условию как раз таки будут меняться элементы при leftIndex == rightIndex

    • @MrSBFI
      @MrSBFI 4 ปีที่แล้ว +1

      @@arhitutorials и сможете ли вы объяснить зачем в условии while (leftIndex

    • @MrSBFI
      @MrSBFI 4 ปีที่แล้ว +1

      @@arhitutorials не очень изящный алгоритм получается из-за озвученных мной двух моментов.

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว +1

      @@MrSBFI почему бы Вам просто не убрать "лишние" операторы и увидеть своими глазами, что получится)

  • @sainthentai7763
    @sainthentai7763 4 ปีที่แล้ว

    Но у меня есть пару вопросов по конкретным участкам алгоритма.

  • @sainthentai7763
    @sainthentai7763 4 ปีที่แล้ว

    P.S Моежете в будущем предоставлять исходники кода без всяких дополнений ? просто хоть и я получил ваш исходник но удалять определенные части кода я боюсь хоть они мне и не нужны. Так как я нууб и не шарю и боюсь в этом случае нарушить фнкциональность кода.

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว

      Хорошо. Чтоб работало нужны функции quickSort(), partition() и swap(). Остальное можно выбросить.

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

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

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

      @@MsDima9999 я забросил программирование как таковое, но если говорить про быструю сортировку, то я её изучил посмотрев видео англоязычного ютубера который очень хорошо разобрал её работу на псевдокоде с куче картинок как она вообще работает а потом показал минималистичный вариант реализации на C/C++ с использованием базового синтаксиса. А добивающим было когда я прочел главу по быстрой сортировке от Лабофаре на java. Тут реализация базового синтаксиса с C/C++ на java из книги была самый раз, но я так еще и не изучил последний раздел быстрой сортировки, анализ среднего случая работы быстрой сортировки, тут я туп и ленив так как анализ алгоритмов от джона маконелла для меня трудна. Но я сейчас забросил учебу программированию(дискретная математика. алгоритмы и структуры данных, прочие разделы Computer science.)

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

      @@sainthentai7763 почему закинул программирование?

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

      @@MsDima9999 как бы так сказать, у меня жизнь жопа в плане самоорганизации, планировании, работе, я большую часть времени прокрастинирую и сижу безработным постоянно в депрессии. Ну как то так

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

    По какой причине может выдавать ошибки в 20 и 22 строках? partition и printSortStep выделяются красным

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

      А, все понял, нужно дальше код прописать)

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

    Спасибо!

    • @arhitutorials
      @arhitutorials  5 ปีที่แล้ว +1

      Рад, что пригодилось. Спасибо за отзыв!

  • @pavelb.9483
    @pavelb.9483 2 ปีที่แล้ว

    Спасибо!