Разбор сортировки пузырьком на языке Java. Исходники: github.com/Arh... Поддержать канал💰: yoomoney.ru/to... #ArhiTutorialsJava #ityoutubersru
Пікірлер: 139
@jopinfuyiro55704 жыл бұрын
Мужик красавчик. Только из твоего видео понял, как работает сортировка пузырьком. Особенно идея с while и boolean вообще огонь!
@lexey27654 жыл бұрын
Как ты понял если видеотшлак я ничего не вижу
@jopinfuyiro55704 жыл бұрын
@@lexey2765 Видео супер. Один раз посмотрел и на всю жизнь запомнил. Даже программистом не надо быть чтобы это понимать.
@lexey27654 жыл бұрын
@@jopinfuyiro5570 я тебе за качество говорю
@ascar664 жыл бұрын
@@lexey2765 так там 1080р что именно не видно?
@hunterlive24342 жыл бұрын
@@ascar66он наверное качество не выставил)
@eugene8287Ай бұрын
второй раз попал но твой урок и опять лучшее объяснение!
@Kiizashi Жыл бұрын
В какой раз ты уже помогаешь мне разобраться с очередной темой! Красава мужик, продолжай в том же духе. Очень нравятся твои видосы, понятно, доступно, без заумных фраз. Супер! То, что и нужно новичку. От души
@sergeysimchenkov92974 жыл бұрын
Весьма доходчиво и просто, спасибо огромное за видео!
@user-ux3dw8ux5c3 жыл бұрын
вот такой метод сортирует весь массив за "один проход" . в пузырьке должно быть два цикла: внешний и внутренний public static void main(String[] args) { int a[] = {2, 4, 66, 4, 3, 23, 5, 330}; bublSort(a); System.out.println(Arrays.toString(a)); } private static void bublSort(int[] a) { for (int i = a.length - 1; i >= 0; i--) { for (int j = 0; j a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } }
@ykkok3992 жыл бұрын
Ребята, можно ли считать метод Олега Молодцова лучшим?
@asakuomu2 жыл бұрын
@@ykkok399 Да
@Hate4You2 жыл бұрын
@@ykkok399 Нельзя. Если массив уже отсортирован, то цикл в любом случае будет продолжаться, пока не дойдет до конца. Метод на видео самый оптимальный, я только его добавил тем, что массив сортируется сразу в обе стороны, как посоветовал автор int[] array = {23, 45, 76, 12, 97, 54, 40, 22, 93, 46, 83, 29}; System.out.println(Arrays.toString(array)); boolean isSorted = true; while (isSorted) { isSorted = false; for (int i = 1; i < array.length; i++) { if (array[i] < array[i - 1]) { int temp = array[i]; array[i] = array[i - 1]; array[i - 1] = temp; isSorted=true; } } for (int i = array.length-1; i>0; i--) { if (array[i] < array[i-1]) { int temp = array[i]; array[i]=array[i-1]; array[i-1]=temp; isSorted=true; } } System.out.println(Arrays.toString(array));
@ianwasley73772 жыл бұрын
нет, ты не прав
@shindaaki Жыл бұрын
@@Hate4You Вот я олень, думал как добавить сортировку с обратной стороны, так и не придумал, спасибо тебе. Учу Джаву месяц.
@user-fi7ih1yg5n5 жыл бұрын
Спасибо и вам, вы мне очень помогли.
@eduardich Жыл бұрын
И лаконично, и очень информативно! спасибо!
@Mariam_PinkLotus4 жыл бұрын
блин, ТЕПЕРЬ поняла. Спасибо, Сергей. Очень понравился этот вариант с while
@iorgankrat1118 Жыл бұрын
Супер, круто объясняете. Удачи Вам
@OlegVaganov3 жыл бұрын
Очень приятно и понятно с разбором деталей! Успехов вам!
@user-zf2cp4zh4f Жыл бұрын
Возможно, мой комментарий не будет особо актуальным, но всё же напишу, что сложность всегда будет не выше О(n²), а это значит, что можно просто в двойном цикле пройтись такой сортировкой, и у нас всегда будет гарантирован результат. Однако, справедливости ради, такой подход является не самым эффективным, так как проходов по массиву может быть и меньше, но всё же, как мне кажется, нельзя упускать такой вариант из виду.
@sunshineforester8747 Жыл бұрын
Спасибо! Разобрался после создания блок-схемы! Теперь нужно разобраться с лишней строкой...
@malene6022 Жыл бұрын
Первый раз вижу реализацию сортировки пузырьком через while и boolean, интересный контент!
@Mariam_PinkLotus4 жыл бұрын
ТЫ - СУПЕР!!! СПАСИБО!
@usertyfoon11 ай бұрын
Спасибо за наглядное объяснение!
@DmitryTyukilin7 ай бұрын
Спасибо! До вашего видео, делал сортировку через два for)
@gagogoga7944 жыл бұрын
Ты бог! Я совсем не давно начал умучать Java и я опечален лишь тем, что не начал это раньше))
@mishazifir2 жыл бұрын
Как успехи год спустя?)
@gagogoga7942 жыл бұрын
@@mishazifir перешёл на JS работаю на фирме ))
@mishazifir2 жыл бұрын
Поздравляю с работой) хороший прогресс за год)
@gagogoga7942 жыл бұрын
@@mishazifir пахал не покладая рук, но не за год, а за полтора
@mishazifir2 жыл бұрын
@@gagogoga794 сам факт, что не бросил достоин уважения)
@olegsvitskyi12413 жыл бұрын
Super video. Spasibo bolshoe za content
@kirilldskoi96614 ай бұрын
Спасибо!
@INMartyn4 жыл бұрын
Спасибо за видео большое, осознал всю логику процесса)
@arsadaul99104 ай бұрын
Спасибо Сергей
@nimgvae4 жыл бұрын
Благодарю,понял что у меня было не так. Я почему то считал, что одного прохода должно хватать.Поэтому цикл "пока" даже не принимал в расчет.Буду смотреть Вас дальше.
@LoginToITJava3 ай бұрын
Спасибо
@user-re8yu3ij3w Жыл бұрын
спасибо, добрый человек!
@ilgul91773 жыл бұрын
Очень понравилось видео. Благодарю.
@mustela704 жыл бұрын
Лайк этому господину!
@Dmitriy_Bulgakov Жыл бұрын
Полезное видео и автор - молодец, толково объясняет, не первое видео смотрю. Единственный момент, наверное все заметили что массив проходится на один раз больше чем требуется - вопрос, нельзя ли код написать так чтобы не было лишнего прохода?..
@monukmort Жыл бұрын
Эм... Заинтриговал, разъясни)
@Das.Kleine.Krokodil Жыл бұрын
@@monukmort при каждом проходе поднимается самый большой элемент и при следующем до него не нужно доходить
@All_Is_Funk Жыл бұрын
Как вариант: можно добавить счетчик захода в тело внутреннего цикла (int К = 0) ; Делать К++ вконце тела внутреннего цикла for. В самом внутреннем цикле скорректировать условие: i < (array.length - К).
@John_Smith_Java9 ай бұрын
Я сделал с двумя циклами for, без while. i - счётчик внешнего цикла. j - счётчик внутреннего цикла. Чтобы при каждой последующей итерации внутреннего цикла не трогать отсортированную часть справа, я просто задал условие внутреннего цикла array.length - i. Флаг назвал wasSwap, объявил его в самом начале внешнего цикла и присвоил false. Если во внутреннем цикле была перестановка элементов, присваиваю true. После каждого круга внутреннего цикла проверяю if-ом значение флага: если оно false, программа завершается.
@andriikniaziev92423 жыл бұрын
Офигенный способ! Спасибо большое!
@MechAlexander Жыл бұрын
спасибо
@ruslan4048 Жыл бұрын
Спасибо большое!
@CoS1NuS12 жыл бұрын
Большое спасибо! Все понятно)
@denisrogov7120 Жыл бұрын
я получил удовольствие от успокаивающей музыки на фоне
@user-uc3yw9fp1b2 жыл бұрын
Спасибо за урок! Всё поняла)
@Andrzej39353 жыл бұрын
Очень доходчиво, спасибо!
@stepandamrin4 жыл бұрын
Спасибо.
@marinette_supercat4 жыл бұрын
Я хз что не так. У меня компилятор прицепился к длине массива. ((((( Спасибо за видео, не понимала, зачем через boolean делать.
@user-lg4wo9bn9g Жыл бұрын
С точки зрения здравого смысла, не лучше ли было изначально переменную boolean IsSorted = true; (означает, что массив отсортирован). Отсортирован == верно, не отсортирован == не верно. Блин вот тогда в условии while противоречие. Пока массив отсортирован. Каким образом взаимодействуют переменная IsSorted и цикл? Как они понимают друг друга? Когда в цикле станет i = array.length , то цикл закончится.
@seka13092 жыл бұрын
Здравствуйте спасибо, хотел уточнить почему нельзя начать с (int i=0;i
@va_golovanov Жыл бұрын
ArrayIndexOutOfBoundsException будет. условно последний элемент имеет индекс 10, а в таком случае мы будем пытаться достать 11 элемент
@asylzhannnn3 жыл бұрын
спасибо очень помогло!!!!можно Двумерный массив уроки
@ylyasakmuhammedov15633 жыл бұрын
Спасибооо
@wamikgildiev6632 Жыл бұрын
кажется шагов будет не 10, а больше. Так как вывод помещен в конце внешнего цикла. А надо в конце внутреннего. Тогда мы точно поймем за сколько операций выполнилась сортировка
@user-kn2uj7vr7t2 жыл бұрын
Еще бы сразу были пояснения на счет Big O, на реальных примерах цены бы не было курсу).
@user-vj6ov3sc6b3 жыл бұрын
Рекомендую
@user-iz7jr4yt1o Жыл бұрын
Пожалуйста объясните что происходит с переменной isSorted , не понимаю, почему в конце true, если последняя строчка false, заранее благодарю за ответ
@_baNZai_ Жыл бұрын
знак ! это отрицание, то есть если написано !False , это означает НеFalse , то есть True, или !True означал бы НеTrue
@romawar18692 жыл бұрын
Вообще да , шикарно , но я еще хотел услышать где когда и зачем можнт такое использовать ?
@arhitutorials2 жыл бұрын
На собеседованиях) Иногда просят на листке написать какой-нибудь алгоритм сортировки. Сортировку пузырьком легче всего вспомнить и написать - самый простой алгоритм.
@VALETWIN2 жыл бұрын
Здравствуйте, как насчет записать видео о лямбда-выражениях.
@user-bm5ql4lf9q2 ай бұрын
Спасибо, еще бы по кнопкам так не бить!!
@Kelbi282 жыл бұрын
While(! isSorted) - разве не равно true? ведь isSorted=false, и при ! - будет обратное ему значение. И второй вопрос, почему мы внутри вайла пишем isSorted=true, что оно значит? Спасибо!
@adrenalin4972 жыл бұрын
В цикле while в скобках мы указываем условие при котором действия внутри цикла будут выполняться. В нашем случае, при условии что isSorted == false ( !isSorted) будет выполняться тело цикла. Внутри isSorted = true нужен, чтобы выйти из цикла, иначе он будет бесконечным.
@Akimbo_-yk9kf Жыл бұрын
в начале цикла Вайл объявил Булиан в тру, почему он сразу не закончился?
@agweprint273 жыл бұрын
сделал сортировку "пузырьком" с помощью рекурсии)
@kirillkirill16572 жыл бұрын
почему в цикле for запускается счетчик с " int i = 1; а не с int i = 0; " ?
@lauhG3 Жыл бұрын
что бы можно было сразу сравнить право с лева и не боятся выхода за границы массива
@user-fz6fs9ey1s6 ай бұрын
В универе видел немного так сказать другую версию с помощью двойного цикла.. Подскажите, в чём разница того, что вы написали и вот моего варианта? как по мне, с двойным циклом как-то проще и не нужно булевых переменных и 'флажков' int [] mas = { 3, -4, 111, 2, 1, 6, 4, 7 }; for (int i = 0; i < mas.length - 1; ++i) { for (int j = 0; j < mas.length - 1 - i; ++j) { if (mas[j + 1] < mas[j]) { int c = mas[j + 1]; mas[j + 1] = mas[j]; mas[j] = c; } } }
@arhitutorials6 ай бұрын
Если подсунуть алгоритму уже отсортированный массив, то ваш вариант все равно сделает n проходов по нему, а мой только один раз пройдет. На случайном массиве ваш вариант в среднем будет быстрее. Но если честно, я не вижу какой-то радикальной разницы. Сортировку пузырьком как не оптимизируй, все равно медленно.
@vantonyan42174 жыл бұрын
Народ извините я тока тока начал изучать Java у меня на этом алгоритме вот кокой вопрос , я все понимаю до того момента когда начался Boolean, прошу вас помогите понять его
@gostudio38403 жыл бұрын
наконец-то ***ть нормальное объяснение ... 20 никчемных статей прочитал перед тем как нашел это видео. И везде усложняют столь простую вещь
@user-fh1vx7iw3p5 жыл бұрын
Так а это все равно не совсем корректный бабл сорт, так как мы каждый раз будем бежать до конца массива , хотя у нас один элемент будет уже отсортирован и нам нужно каждый раз один отбрасывать
@shluhogon_422 жыл бұрын
Да. Такой вариант будет чуть оптимальнее на мой взгляд: boolean isSorted = false; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j+1] = temp; isSorted = true; } } if (!isSorted) { break; }
@user-or1hy4xz8u2 жыл бұрын
@@shluhogon_42 , а может лучше че т замутить с применением else { isSorted = false; } - как-то так? Как чел выше предлагает.
@user-lg4wo9bn9g9 ай бұрын
7:11 почему вы её не исключили?
@user-segadev Жыл бұрын
15.10.2022
@Novichek55 Жыл бұрын
В видео прозвучало что сортировка с двух сторон ускорит время выполнения, у меня наоборот сортировка в одну сторону работает быстрее. Народ есть у кого код двусторонней сортировки, которая работает быстрее, можете выложить плиз?
@DzhaparBigishiev5 ай бұрын
что такое array[i - 1] в этом коде?
@liliyasiadzelnikava96 Жыл бұрын
c while и флагом isSorted гораздо понятнее, чем с двойным циклом
@mvader934 жыл бұрын
Подскажите почему нельзя было просто написать: int temp = array[i-1] Зачем было ещё две строки вписывать? Спасибо
@arhitutorials4 жыл бұрын
Это обмен местами двух элементов в массиве. Состоит из 3-х действий: 1) элемент в [i] запоминаем в переменной temp; 2) в [i] записываем элемент [i -1]; 3) в [i - 1] записываем temp. В одно действие никак не получится, если сделать array[i] = array[i - 1], число в array[i] будет затерто. Чтоб его не потерять, array[i] перед присваиванием сохраняется в temp.
@user-cx5ry5tt6s4 жыл бұрын
Извиняюсь, а почему нельзя было просто 2-мя циклами for пробежаться и сравнивать if( array[i] < array[J]) ? Ну тип без всяких лишних bool переменных
@arhitutorials4 жыл бұрын
два цикла for без bool переменной - это всегда гарантированные n*n итераций по массиву, даже если на вход подан уже отсортированный массив. То есть это наихудший варианты в смысле производительности, который может произойти с этим алгоритмом, но работать будет.
@user-cx5ry5tt6s4 жыл бұрын
@@arhitutorials Класс!!! Спасибо за ответ. Всегда думал, что двумя for циклами это самый оптимальный вариант. Спасибо вам, теперь беру на вооружение ваш способ с bool)
@John_Smith_Java9 ай бұрын
@@arhitutorials while - это же тоже цикл. Я к тому, что с двумя циклами for один в другом и булевой переменной эффективность будет не хуже, чем в вашем варианте. Только в случае с двумя for мы бесплатно получаем счётчик внешнего цикла, который можно использовать во внутреннем цикле, чтобы избежать прохождения по отсортированной части.
@user-ss3bv7ff3k3 жыл бұрын
Выкидывает ошибку почему то, может быть расширить или типа того
@Hate4You2 жыл бұрын
Почему у меня может не работать функция printArray? Подсвечивает красным
@arhitutorials2 жыл бұрын
Замените строчку на: Arrays.toString(arr);
@Hate4You2 жыл бұрын
@@arhitutorials спасибо
@user-wg7uq6wx4d2 жыл бұрын
почему printArray(array) подсвечивается красном не понимаю много искал способ но нашел
@arhitutorials2 жыл бұрын
Замените printArray(array) на System.out.println(array.toString());
@user-wg7uq6wx4d2 жыл бұрын
@@arhitutorials у вас есть курсы по джаве полный? Или можете сделать интервью и ответит на вопросы Например мой вопрос: как развить мышление, мышление кода,. Говорят есть и другие способы решать но мне никогда не хватает идея на этих способу.
@arhitutorials2 жыл бұрын
@@user-wg7uq6wx4d курса нет, потому что пока некогда его делать, работать надо. По вашему вопросу мне есть что сказать, как-нибудь запишу.
@user-wg7uq6wx4d2 жыл бұрын
@@arhitutorials с нетерпением жду
@user-xg8xn5me5k3 жыл бұрын
А разве не самый простой способ сортировки массива через Arrays.sort(); или я что-то путаю?
@arhitutorials3 жыл бұрын
Это видео для тех, кто алгоритмы изучает, а не для тех, кому просто надо отсортировать массив. Сортировки - это раздел Computer Science. Есть мнение, что для инженера полезно знать, что как внутри устроено.
@mvader934 жыл бұрын
И зачем boolean вводили не могу понять))?
@arhitutorials4 жыл бұрын
boolean для того, чтобы вовремя остановить сортировку. Запоминаем в boolean переменной, были ли на предыдущем шаге перестановки, если нет - сортировка закончена.
@user-fh1vx7iw3p5 жыл бұрын
А тут элемент после каждого прохода не отбрасываеться
@arhitutorials5 жыл бұрын
Это минимальная реализация бабл сорт, без всяких оптимизаций. Она не эффективна, согласен, но с точки зрения результата, вполне корректна. Действительно, можно отбрасывать по одному элементу, после каждого прохода, потому что образуется отсортированная последовательность, по которой делать проход не нужно. Можно еще чередовать проходы слева направо и справа налево, тогда можно отбрасывать элементы с двух концов поочередно. Но сложность при этом будет все равно O(n^2). Но это еще не самый неэффективный алгоритм сортировки из существующих habr.com/ru/post/198114/
@alexuvarov89015 жыл бұрын
ваш метод не совсем корректен: из-за использования флага нам приходится проходить ещё один шаг в цикле while, когда массив уже отсортирован, соответственно выводить на одну (повторяющуюся) строку больше в консоль
@arhitutorials5 жыл бұрын
Ок, предложите тогда ваш вариант алгоритма. Думаю, всем будет интересно посмотреть.
@user-wr6cw2sk2y4 жыл бұрын
помести первую строчку цикла while: "isSorted=true;" в else после if
@user-or1hy4xz8u2 жыл бұрын
@@user-wr6cw2sk2y, это избавит от проблемы еще одного шага в цикле?
@user-tk7nh1jw3y2 жыл бұрын
Это не проблема, т.к. сложность алгоритма всё равно останется O(n^2)
@John_Smith_Java Жыл бұрын
Кто-то из великих, не помню, кто, возможно, сам господин Немчинский, советовал держаться подальше от компаний, которые на собеседовании просят написать программу на листочке🤔😊
@Das.Kleine.Krokodil Жыл бұрын
Почему?
@usertyfoon11 ай бұрын
@@Das.Kleine.Krokodilу Немчинского много полезных видео
@Das.Kleine.Krokodil11 ай бұрын
@@usertyfoon вопрос то в другом
@user-li9be3jj3z Жыл бұрын
слабое обьяснение
@GF-ug7iv Жыл бұрын
А таким кодом что ты написал можно даже заделать инверсивную сортировку. Только убери Boolean и в цикле массив дели на 2
@GF-ug7iv Жыл бұрын
Просто интересно, если тебе бы надо было найти определенный индекс в массиве ты бы тоже через такую сортировку это делал???
@arhitutorials Жыл бұрын
Поиск индекса в массиве через сортировку - эта задача нетривиальная. Но если надо, сделаем)
@user-re7go8ly2s3 жыл бұрын
А можно было сделать так? Найти меньшее число поставить в начало и так далее
@arhitutorials3 жыл бұрын
Можно, получится сортировка выбором.
@user-re7go8ly2s3 жыл бұрын
@@arhitutorials хочу начать обучение java.. Посаветуете. Или курсы или самостоятельно по книгам?
@user-cq3hr5op5q3 жыл бұрын
@@user-re7go8ly2s Смотри этого молодого человека, потом Джошуа Блох "Эффективное программирование", и ручками все повторяй