public static void sort(int[] array) {
int temp = 0;
boolean isSorted = false;
while (!isSorted) {
// isSorted = true;
for (int i = 0; i < array.length - 1; i++) {
if (array[i] < array[i + 1]) {
isSorted = false;
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
/* else if (array[i] > array[i+1]) {
isSorted = true;
}
*/
}
}
}
Ребята привет, есть несколько вопросов по условию boolean в цикле. видимо остались пробелы.
1. Строка 5, зачем устанавливается флажок в true? Как работает код при этом? Почему получается бесконечный цикл если его убрать? Эквивалентна ли эта запись 14-15 строчке?
2. Как работает цикл while и вложенный цикл for для этого кода? Не могу понять логику
3. Строка 8 для чего здесь снова присваиваем false?
В общем совсем, не понимаю как работают условия здесь со вложенным циклом.
Буду очень благодарен за подробный ответ для чайника...)
Grigory Vladimirovich
23 уровень
while и boolean, сортировка
Решен
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Иван Шляхтин
24 апреля 2018, 10:21решение
говорит о том, что пока isSorted == false(пока массив не отсортирован) , цикл будет выполняться
Потому если после этого не поставить isSorted = true (массив отсортирован) - цикл будет выполняться бесконечно.
Далее циклом for мы проверяем отсортированы ли элементы нашего массива, если находятся элементы которые не отсортированы в нужном порядке они меняются местами .
И ставиться флаг isSorted = false(массив не отсортирован) ;
Проходим цикл for заново, и так до тех пор пока весь массив не будет отсортирован.
Тогда isSorted останется равным true и цикл while завершиться.
Заменить 5 строку на 14 - 15 нельзя.
+2
Grigory Vladimirovich
24 апреля 2018, 11:18
То есть получается, что выход из цикла произойдет тогда, когда строчка 8 поменяется на true и во всем массиве не останется элементов для обмена?
0
Roman Java Developer Expert
24 апреля 2018, 11:37решение
флаг устанавливается в true в 5й строке, а в 8й меняется на false в случае, если был осуществлен обмен элементов. И да, в случае, когда элементов для обмена не будет, строка 8 не отработает, флаг останется true и мы выйдем из цикла.
+2
Grigory Vladimirovich
24 апреля 2018, 11:43
Понял, спасибо!
Последний вопрос:
Почему код продолжает работу при условии !isSorted, если следующей строчкой (5) мы меняем его на true?
0
Roman Java Developer Expert
24 апреля 2018, 11:53решение
Потому, что условие не проверяется после каждой строчки, в данном типе цикла оно проверяется в начале:
true - входим в блок цикла
false - не входим
Если вошли в блок цикла (true), после его выполнения снова идем на проверку условия и так до тех пор, пока не будет false.
+2
Grigory Vladimirovich
24 апреля 2018, 12:00
Спасибо! Сильно прояснили ситуацию!
0
Андрей
24 апреля 2018, 09:30
в том виде, в котором код тут представлен, он не работает, while бесконечен
наличие else if тут не поможет, т.к. если вдруг в самом начале списка будут идти 9 8 3 7, то работа программы закончится на первой итерации for.
0
hidden #1278682
24 апреля 2018, 05:15
это типо сортировка пузырьком, только внешний цикл for заменили на while
0