В какой раз ты уже помогаешь мне разобраться с очередной темой! Красава мужик, продолжай в том же духе. Очень нравятся твои видосы, понятно, доступно, без заумных фраз. Супер! То, что и нужно новичку. От души
Благодарю,понял что у меня было не так. Я почему то считал, что одного прохода должно хватать.Поэтому цикл "пока" даже не принимал в расчет.Буду смотреть Вас дальше.
Полезное видео и автор - молодец, толково объясняет, не первое видео смотрю. Единственный момент, наверное все заметили что массив проходится на один раз больше чем требуется - вопрос, нельзя ли код написать так чтобы не было лишнего прохода?..
Как вариант: можно добавить счетчик захода в тело внутреннего цикла (int К = 0) ; Делать К++ вконце тела внутреннего цикла for. В самом внутреннем цикле скорректировать условие: i < (array.length - К).
Я сделал с двумя циклами for, без while. i - счётчик внешнего цикла. j - счётчик внутреннего цикла. Чтобы при каждой последующей итерации внутреннего цикла не трогать отсортированную часть справа, я просто задал условие внутреннего цикла array.length - i. Флаг назвал wasSwap, объявил его в самом начале внешнего цикла и присвоил false. Если во внутреннем цикле была перестановка элементов, присваиваю true. После каждого круга внутреннего цикла проверяю if-ом значение флага: если оно false, программа завершается.
Это видео для тех, кто алгоритмы изучает, а не для тех, кому просто надо отсортировать массив. Сортировки - это раздел Computer Science. Есть мнение, что для инженера полезно знать, что как внутри устроено.
ваш метод не совсем корректен: из-за использования флага нам приходится проходить ещё один шаг в цикле while, когда массив уже отсортирован, соответственно выводить на одну (повторяющуюся) строку больше в консоль
Возможно, мой комментарий не будет особо актуальным, но всё же напишу, что сложность всегда будет не выше О(n²), а это значит, что можно просто в двойном цикле пройтись такой сортировкой, и у нас всегда будет гарантирован результат. Однако, справедливости ради, такой подход является не самым эффективным, так как проходов по массиву может быть и меньше, но всё же, как мне кажется, нельзя упускать такой вариант из виду.
вот такой метод сортирует весь массив за "один проход" . в пузырьке должно быть два цикла: внешний и внутренний 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; } } } } }
@@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));
С точки зрения здравого смысла, не лучше ли было изначально переменную boolean IsSorted = true; (означает, что массив отсортирован). Отсортирован == верно, не отсортирован == не верно. Блин вот тогда в условии while противоречие. Пока массив отсортирован. Каким образом взаимодействуют переменная IsSorted и цикл? Как они понимают друг друга? Когда в цикле станет i = array.length , то цикл закончится.
Народ извините я тока тока начал изучать Java у меня на этом алгоритме вот кокой вопрос , я все понимаю до того момента когда начался Boolean, прошу вас помогите понять его
В универе видел немного так сказать другую версию с помощью двойного цикла.. Подскажите, в чём разница того, что вы написали и вот моего варианта? как по мне, с двойным циклом как-то проще и не нужно булевых переменных и 'флажков' 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; } } }
Если подсунуть алгоритму уже отсортированный массив, то ваш вариант все равно сделает n проходов по нему, а мой только один раз пройдет. На случайном массиве ваш вариант в среднем будет быстрее. Но если честно, я не вижу какой-то радикальной разницы. Сортировку пузырьком как не оптимизируй, все равно медленно.
While(! isSorted) - разве не равно true? ведь isSorted=false, и при ! - будет обратное ему значение. И второй вопрос, почему мы внутри вайла пишем isSorted=true, что оно значит? Спасибо!
В цикле while в скобках мы указываем условие при котором действия внутри цикла будут выполняться. В нашем случае, при условии что isSorted == false ( !isSorted) будет выполняться тело цикла. Внутри isSorted = true нужен, чтобы выйти из цикла, иначе он будет бесконечным.
В видео прозвучало что сортировка с двух сторон ускорит время выполнения, у меня наоборот сортировка в одну сторону работает быстрее. Народ есть у кого код двусторонней сортировки, которая работает быстрее, можете выложить плиз?
кажется шагов будет не 10, а больше. Так как вывод помещен в конце внешнего цикла. А надо в конце внутреннего. Тогда мы точно поймем за сколько операций выполнилась сортировка
Это обмен местами двух элементов в массиве. Состоит из 3-х действий: 1) элемент в [i] запоминаем в переменной temp; 2) в [i] записываем элемент [i -1]; 3) в [i - 1] записываем temp. В одно действие никак не получится, если сделать array[i] = array[i - 1], число в array[i] будет затерто. Чтоб его не потерять, array[i] перед присваиванием сохраняется в temp.
На собеседованиях) Иногда просят на листке написать какой-нибудь алгоритм сортировки. Сортировку пузырьком легче всего вспомнить и написать - самый простой алгоритм.
boolean для того, чтобы вовремя остановить сортировку. Запоминаем в boolean переменной, были ли на предыдущем шаге перестановки, если нет - сортировка закончена.
Это минимальная реализация бабл сорт, без всяких оптимизаций. Она не эффективна, согласен, но с точки зрения результата, вполне корректна. Действительно, можно отбрасывать по одному элементу, после каждого прохода, потому что образуется отсортированная последовательность, по которой делать проход не нужно. Можно еще чередовать проходы слева направо и справа налево, тогда можно отбрасывать элементы с двух концов поочередно. Но сложность при этом будет все равно O(n^2). Но это еще не самый неэффективный алгоритм сортировки из существующих habr.com/ru/post/198114/
Кто-то из великих, не помню, кто, возможно, сам господин Немчинский, советовал держаться подальше от компаний, которые на собеседовании просят написать программу на листочке🤔😊
два цикла for без bool переменной - это всегда гарантированные n*n итераций по массиву, даже если на вход подан уже отсортированный массив. То есть это наихудший варианты в смысле производительности, который может произойти с этим алгоритмом, но работать будет.
@@arhitutorials Класс!!! Спасибо за ответ. Всегда думал, что двумя for циклами это самый оптимальный вариант. Спасибо вам, теперь беру на вооружение ваш способ с bool)
@@arhitutorials while - это же тоже цикл. Я к тому, что с двумя циклами for один в другом и булевой переменной эффективность будет не хуже, чем в вашем варианте. Только в случае с двумя for мы бесплатно получаем счётчик внешнего цикла, который можно использовать во внутреннем цикле, чтобы избежать прохождения по отсортированной части.
@@arhitutorials у вас есть курсы по джаве полный? Или можете сделать интервью и ответит на вопросы Например мой вопрос: как развить мышление, мышление кода,. Говорят есть и другие способы решать но мне никогда не хватает идея на этих способу.
Так а это все равно не совсем корректный бабл сорт, так как мы каждый раз будем бежать до конца массива , хотя у нас один элемент будет уже отсортирован и нам нужно каждый раз один отбрасывать
В какой раз ты уже помогаешь мне разобраться с очередной темой! Красава мужик, продолжай в том же духе. Очень нравятся твои видосы, понятно, доступно, без заумных фраз. Супер! То, что и нужно новичку. От души
Первый раз вижу реализацию сортировки пузырьком через while и boolean, интересный контент!
Спасибо! До вашего видео, делал сортировку через два for)
Спасибо Сергей
я получил удовольствие от успокаивающей музыки на фоне
Благодарю,понял что у меня было не так. Я почему то считал, что одного прохода должно хватать.Поэтому цикл "пока" даже не принимал в расчет.Буду смотреть Вас дальше.
Мужик красавчик. Только из твоего видео понял, как работает сортировка пузырьком. Особенно идея с while и boolean вообще огонь!
Как ты понял если видеотшлак я ничего не вижу
@@lexey2765 Видео супер. Один раз посмотрел и на всю жизнь запомнил. Даже программистом не надо быть чтобы это понимать.
@@jopinfuyiro5570 я тебе за качество говорю
@@lexey2765 так там 1080р что именно не видно?
@@ascar66он наверное качество не выставил)
Полезное видео и автор - молодец, толково объясняет, не первое видео смотрю. Единственный момент, наверное все заметили что массив проходится на один раз больше чем требуется - вопрос, нельзя ли код написать так чтобы не было лишнего прохода?..
Эм... Заинтриговал, разъясни)
@@monukmort при каждом проходе поднимается самый большой элемент и при следующем до него не нужно доходить
Как вариант:
можно добавить счетчик захода в тело внутреннего цикла (int К = 0) ;
Делать К++ вконце тела внутреннего цикла for.
В самом внутреннем цикле скорректировать условие: i < (array.length - К).
Я сделал с двумя циклами for, без while.
i - счётчик внешнего цикла.
j - счётчик внутреннего цикла.
Чтобы при каждой последующей итерации внутреннего цикла не трогать отсортированную часть справа, я просто задал условие внутреннего цикла array.length - i.
Флаг назвал wasSwap, объявил его в самом начале внешнего цикла и присвоил false.
Если во внутреннем цикле была перестановка элементов, присваиваю true.
После каждого круга внутреннего цикла проверяю if-ом значение флага: если оно false, программа завершается.
Спасибооо
спасибо очень помогло!!!!можно Двумерный массив уроки
7:11 почему вы её не исключили?
наконец-то ***ть нормальное объяснение ... 20 никчемных статей прочитал перед тем как нашел это видео. И везде усложняют столь простую вещь
А разве не самый простой способ сортировки массива через Arrays.sort(); или я что-то путаю?
Это видео для тех, кто алгоритмы изучает, а не для тех, кому просто надо отсортировать массив. Сортировки - это раздел Computer Science.
Есть мнение, что для инженера полезно знать, что как внутри устроено.
ваш метод не совсем корректен: из-за использования флага нам приходится проходить ещё один шаг в цикле while, когда массив уже отсортирован, соответственно выводить на одну (повторяющуюся) строку больше в консоль
Ок, предложите тогда ваш вариант алгоритма. Думаю, всем будет интересно посмотреть.
помести первую строчку цикла while: "isSorted=true;" в else после if
@@IvanDubrovin-p7z, это избавит от проблемы еще одного шага в цикле?
Это не проблема, т.к. сложность алгоритма всё равно останется O(n^2)
Возможно, мой комментарий не будет особо актуальным, но всё же напишу, что сложность всегда будет не выше О(n²), а это значит, что можно просто в двойном цикле пройтись такой сортировкой, и у нас всегда будет гарантирован результат. Однако, справедливости ради, такой подход является не самым эффективным, так как проходов по массиву может быть и меньше, но всё же, как мне кажется, нельзя упускать такой вариант из виду.
Здравствуйте спасибо, хотел уточнить почему нельзя начать с (int i=0;i
ArrayIndexOutOfBoundsException будет. условно последний элемент имеет индекс 10, а в таком случае мы будем пытаться достать 11 элемент
вот такой метод сортирует весь массив за "один проход" . в пузырьке должно быть два цикла: внешний и внутренний
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;
}
}
}
}
}
Ребята, можно ли считать метод Олега Молодцова лучшим?
@@ykkok399 Да
@@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));
нет, ты не прав
@@Hate4You Вот я олень, думал как добавить сортировку с обратной стороны, так и не придумал, спасибо тебе. Учу Джаву месяц.
С точки зрения здравого смысла, не лучше ли было изначально переменную boolean IsSorted = true; (означает, что массив отсортирован). Отсортирован == верно, не отсортирован == не верно. Блин вот тогда в условии while противоречие. Пока массив отсортирован.
Каким образом взаимодействуют переменная IsSorted и цикл? Как они понимают друг друга? Когда в цикле станет i = array.length , то цикл закончится.
Пожалуйста объясните что происходит с переменной isSorted , не понимаю, почему в конце true, если последняя строчка false, заранее благодарю за ответ
знак ! это отрицание, то есть если написано !False , это означает НеFalse , то есть True, или !True означал бы НеTrue
Весьма доходчиво и просто, спасибо огромное за видео!
Спасибо и вам, вы мне очень помогли.
слабое обьяснение
Я хз что не так. У меня компилятор прицепился к длине массива. (((((
Спасибо за видео, не понимала, зачем через boolean делать.
Народ извините я тока тока начал изучать Java у меня на этом алгоритме вот кокой вопрос , я все понимаю до того момента когда начался Boolean, прошу вас помогите понять его
Спасибо, еще бы по кнопкам так не бить!!
блин, ТЕПЕРЬ поняла. Спасибо, Сергей. Очень понравился этот вариант с while
Очень приятно и понятно с разбором деталей! Успехов вам!
что такое array[i - 1] в этом коде?
В универе видел немного так сказать другую версию с помощью двойного цикла..
Подскажите, в чём разница того, что вы написали и вот моего варианта? как по мне, с двойным циклом как-то проще и не нужно булевых переменных и 'флажков'
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;
}
}
}
Если подсунуть алгоритму уже отсортированный массив, то ваш вариант все равно сделает n проходов по нему, а мой только один раз пройдет. На случайном массиве ваш вариант в среднем будет быстрее.
Но если честно, я не вижу какой-то радикальной разницы. Сортировку пузырьком как не оптимизируй, все равно медленно.
почему в цикле for запускается счетчик с " int i = 1; а не с int i = 0; " ?
что бы можно было сразу сравнить право с лева и не боятся выхода за границы массива
15.10.2022
While(! isSorted) - разве не равно true? ведь isSorted=false, и при ! - будет обратное ему значение.
И второй вопрос, почему мы внутри вайла пишем isSorted=true, что оно значит?
Спасибо!
В цикле while в скобках мы указываем условие при котором действия внутри цикла будут выполняться. В нашем случае, при условии что isSorted == false ( !isSorted) будет выполняться тело цикла. Внутри isSorted = true нужен, чтобы выйти из цикла, иначе он будет бесконечным.
Супер, круто объясняете.
Удачи Вам
А таким кодом что ты написал можно даже заделать инверсивную сортировку. Только убери Boolean и в цикле массив дели на 2
Super video. Spasibo bolshoe za content
Спасибо
Спасибо!
ТЫ - СУПЕР!!! СПАСИБО!
спасибо
И лаконично, и очень информативно! спасибо!
В видео прозвучало что сортировка с двух сторон ускорит время выполнения, у меня наоборот сортировка в одну сторону работает быстрее. Народ есть у кого код двусторонней сортировки, которая работает быстрее, можете выложить плиз?
c while и флагом isSorted гораздо понятнее, чем с двойным циклом
Лайк этому господину!
Здравствуйте, как насчет записать видео о лямбда-выражениях.
в начале цикла Вайл объявил Булиан в тру, почему он сразу не закончился?
Спасибо! Разобрался после создания блок-схемы! Теперь нужно разобраться с лишней строкой...
кажется шагов будет не 10, а больше. Так как вывод помещен в конце внешнего цикла. А надо в конце внутреннего. Тогда мы точно поймем за сколько операций выполнилась сортировка
второй раз попал но твой урок и опять лучшее объяснение!
Спасибо за видео большое, осознал всю логику процесса)
Еще бы сразу были пояснения на счет Big O, на реальных примерах цены бы не было курсу).
Выкидывает ошибку почему то, может быть расширить или типа того
Просто интересно, если тебе бы надо было найти определенный индекс в массиве ты бы тоже через такую сортировку это делал???
Поиск индекса в массиве через сортировку - эта задача нетривиальная. Но если надо, сделаем)
сделал сортировку "пузырьком" с помощью рекурсии)
Ты бог! Я совсем не давно начал умучать Java и я опечален лишь тем, что не начал это раньше))
Как успехи год спустя?)
@@mishazifir перешёл на JS работаю на фирме ))
Поздравляю с работой) хороший прогресс за год)
@@mishazifir пахал не покладая рук, но не за год, а за полтора
@@gagogoga794 сам факт, что не бросил достоин уважения)
Спасибо!
Спасибо.
спасибо, добрый человек!
Спасибо за наглядное объяснение!
Очень понравилось видео. Благодарю.
Большое спасибо! Все понятно)
Подскажите почему нельзя было просто написать:
int temp = array[i-1]
Зачем было ещё две строки вписывать?
Спасибо
Это обмен местами двух элементов в массиве. Состоит из 3-х действий:
1) элемент в [i] запоминаем в переменной temp;
2) в [i] записываем элемент [i -1];
3) в [i - 1] записываем temp.
В одно действие никак не получится,
если сделать array[i] = array[i - 1], число в array[i] будет затерто. Чтоб его не потерять, array[i] перед присваиванием сохраняется в temp.
Спасибо большое!
Вообще да , шикарно , но я еще хотел услышать где когда и зачем можнт такое использовать ?
На собеседованиях) Иногда просят на листке написать какой-нибудь алгоритм сортировки. Сортировку пузырьком легче всего вспомнить и написать - самый простой алгоритм.
Спасибо
Офигенный способ! Спасибо большое!
Рекомендую
И зачем boolean вводили не могу понять))?
boolean для того, чтобы вовремя остановить сортировку. Запоминаем в boolean переменной, были ли на предыдущем шаге перестановки, если нет - сортировка закончена.
Спасибо!
Спасибо за урок!
Всё поняла)
Очень доходчиво, спасибо!
А тут элемент после каждого прохода не отбрасываеться
Это минимальная реализация бабл сорт, без всяких оптимизаций. Она не эффективна, согласен, но с точки зрения результата, вполне корректна. Действительно, можно отбрасывать по одному элементу, после каждого прохода, потому что образуется отсортированная последовательность, по которой делать проход не нужно. Можно еще чередовать проходы слева направо и справа налево, тогда можно отбрасывать элементы с двух концов поочередно. Но сложность при этом будет все равно O(n^2). Но это еще не самый неэффективный алгоритм сортировки из существующих habr.com/ru/post/198114/
Кто-то из великих, не помню, кто, возможно, сам господин Немчинский, советовал держаться подальше от компаний, которые на собеседовании просят написать программу на листочке🤔😊
Почему?
@@Das.Kleine.Krokodilу Немчинского много полезных видео
@@usertyfoon вопрос то в другом
Спасибо
спасибо
Извиняюсь, а почему нельзя было просто 2-мя циклами for пробежаться и сравнивать if( array[i] < array[J]) ? Ну тип без всяких лишних bool переменных
два цикла for без bool переменной - это всегда гарантированные n*n итераций по массиву, даже если на вход подан уже отсортированный массив. То есть это наихудший варианты в смысле производительности, который может произойти с этим алгоритмом, но работать будет.
@@arhitutorials Класс!!! Спасибо за ответ. Всегда думал, что двумя for циклами это самый оптимальный вариант. Спасибо вам, теперь беру на вооружение ваш способ с bool)
@@arhitutorials while - это же тоже цикл. Я к тому, что с двумя циклами for один в другом и булевой переменной эффективность будет не хуже, чем в вашем варианте. Только в случае с двумя for мы бесплатно получаем счётчик внешнего цикла, который можно использовать во внутреннем цикле, чтобы избежать прохождения по отсортированной части.
почему printArray(array) подсвечивается красном не понимаю много искал способ но нашел
Замените printArray(array) на System.out.println(array.toString());
@@arhitutorials у вас есть курсы по джаве полный?
Или можете сделать интервью и ответит на вопросы
Например мой вопрос: как развить мышление, мышление кода,.
Говорят есть и другие способы решать но мне никогда не хватает идея на этих способу.
@@ПарасатМолдажар-ь6м курса нет, потому что пока некогда его делать, работать надо.
По вашему вопросу мне есть что сказать, как-нибудь запишу.
@@arhitutorials с нетерпением жду
Так а это все равно не совсем корректный бабл сорт, так как мы каждый раз будем бежать до конца массива , хотя у нас один элемент будет уже отсортирован и нам нужно каждый раз один отбрасывать
Да. Такой вариант будет чуть оптимальнее на мой взгляд:
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;
}
@@shluhogon_42 , а может лучше че т замутить с применением else { isSorted = false; } - как-то так? Как чел выше предлагает.
Почему у меня может не работать функция printArray? Подсвечивает красным
Замените строчку на: Arrays.toString(arr);
@@arhitutorials спасибо
А можно было сделать так? Найти меньшее число поставить в начало и так далее
Можно, получится сортировка выбором.
@@arhitutorials хочу начать обучение java.. Посаветуете. Или курсы или самостоятельно по книгам?
@@алекспервый-ж1ъ Смотри этого молодого человека, потом Джошуа Блох "Эффективное программирование", и ручками все повторяй