В общем это кусок кода,я, хотел бы уточнить работу цикла который должен выводить вводимые числа в возрастающем порядке.
1. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in) );
2. int spisok[] = new int[5];
3. for (int i = 0; i < spisok.length; i++)
4. {
5. spisok[i] = Integer.parseInt(reader.readLine());
6. }
7. for(int i = 4; i >= 0 ; i--) {
8. for(int j = 0 ; j < i ; j++) {
9. if( spisok[j] < spisok[j+1] ) {
10. int tmp = spisok[j];
11. spisok[j] = spisok[j+1];
12. spisok[j+1] = tmp;
13. }
14. }
15. System.out.println(spisok[i]); }
Внизу перечень моего понимания работы цикла, прошу указать какие пункты являются ложными и почему:
1. Работа цикла начинается в строке 7 и заканчивается в строке 15 ?
2. В строках 7 и 8 используется перебор значений. В строке 7 происходит перебор intовых значений массива (условно говоря по-горизонтали), то есть программа выполняется слева направо, в строке 8 происходит перебор intовых значений массива (условно говоря по-вертикали), за счет чего происходит смещение программы вправо, как если бы каждая последующая ячейка массива была бы столбцом.?
3. Перебор элементов массива происходит с правого края (с последней ячейки), потому что int i = 4 и на каждой последующей итерации программа смещается справа налево [0], [1], [2], [3], [4] ?
3. Утверждение 2 неверно и перепутано с "Двумерными массивами". На самом деле в строке 7 ячейки массива перебираются поочередно, но в строке 8 переменная "j" это просто число, значение которого сравнивается с переменной "і" - индексом ячейки массива, для отрабатывания уменьшающегося количества переборов условий "if"?
4. Код выводит значения правильно, но из того что я вижу, строки с 9 по 12 выглядят неправильно. Допустим в ячейке "spisok[j]" находится значение "10", а в ячейке "spisok[j+1]" находится значение "12". Так ведь "10" меньше "12" - вот и вроде хорошо? - ан, нет ! строка 9 дословно: если значение в ячейке "spisok[j]" это "10", а в "spisok[j+1]" это "12", то:
а) в tmp (временная интовая переменная) заносится "10",
б) в "spisok[j]" заносится "12",
в) в "spisok[j+1]" заносится tmp ,т.е. наша "10".
Выходит числа должны выводится "12, 10..." в ниспадающем порядке, а они выводятся правильно, как в условии в возрастающем !
Может это связано с тем что перебор выполняется с крайней правой ячейки ?
Товарищи помогите пожалуйста!
5. Если каждый раз условие внутреннего цикла (;j < i;) сравнивается с переменной "i", то мы имеем два условия окончания цикла: первое при котором работа в строках 9-12 пройдет по всем парам и не отработает; второе при котором пара циклов в строках 7-8 отработает конечное количество раз, а именно 10 раз? Объяснение почему 10 раз внизу.; или одно условие ? Потому что строки 9-12 все равно будут выполнять перебор
ограниченное двумя циклами количество раз, даже когда после трех переборов последовательность будет соответствовать условию.
6.цикл проходит 4 (0,1,2,3) раза (внешний цикл значение 4), потом 3 (0,1,2) раза (внешний цикл значение 3),
потом 2 (0,1) раза (внешний цикл значение 2), потом 1 (0) раз (внешний цикл значение 1). Объясните пожалуйста также порядок выполнения работы цикла.
Помогите пожалуйста! Очень нуждаюсь в разъяснении, запутался в конец! Руки опускаются...
Андрей
20 уровень
Вопрос о работе цикла.
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
10 декабря 2019, 15:44решение
1) да
2) перебираются не значения массива, а индексы. У тебя одномерный массив, его нельзя представить в виде таблицы, его можно представить только в виде ряда значений.
3) вижу ты и сам понял п. 2
4) ты рассуждаешь верно, и сортировка написана по убыванию, но ты и выводишь содержимое задом наперед. Ведь сначала ты выводишь spisok[i] при i равном 4, потом при i = 3 и т.д.
Лучше сначала отсортировать значения, а потом уже выводить в отдельном цикле.
5) строки 9-12 вообще не перебирают пары, они проверяют конкретную пару при текущем значении j. на условия цикла эти строки не влияют.
6) все верно, только у тебя произойдет еще один "холостой" прогон внешнего цикла: при i == 0 внутренний цикл не выполнится ни разу. Поэтому внешний цикл можно было ограничить строго > 0.
Надо понимать, почему вообще изменяется i, зачем каждый раз ограничивать число j все более строгим значением i.
При первом прогоне внешнего цикла самое большое (или самое малое, в зависимости от сравнения) значение уползет на крайнее правое значение. Или можно сказать, всплывет, как пузырек, поэтому сортировку называют пузырьковой. Поскольку мы уже сравнили его со всеми остальными значениями, сравнивать повторно его не имеет смысла. Поэтому на втором круге мы будем сравнивать второе значение со всеми остальными кроме самого правого, и т.д., пока не "всплывут" все остальные пузырьки.
+2
Андрей
10 декабря 2019, 15:53
перевариваю
0
Андрей
10 декабря 2019, 16:33
Значит пункт два у меня неправильный, а три и три - правильные.
про "задом на перед" въехал.
Когда прочитал про проверку "конкретной пары" (ответ 5), то опять ступорок. В моем понимании "i" в строчке 7 - это длинна массива, а "j" - это конкретное значение массива такого-то индекса. Так ли это?
Еще меня путает "spisok.length - 1", его можно подставить вместо 4 в инициализации первого цикла где int i = 4 (int i = spisok.length - 1). Результат не поменяется. Путает то что в строке 2 кода переменная "spisok" хранит ссылку на массив значений из 5 ячеек, а в условии первого цикла где int i = 4, четыре, это максимальный индекс (наибольший номер ячейки). Прав ли я ?
0
hidden #598481
10 декабря 2019, 17:19решение
По поводу length: в любом массиве индексы нумеруются с нуля, а length хранит натуральное количество элементов в массиве.
Если в массиве 15 элементов, то последний пятнадцатый по счету элемент будет иметь индекс 14, а если 500, то индекс последнего 499. Поэтому если мы хотим начинать от последнего элемента, то стоит писать "spisok.length - 1". Просто в данном конкретном случае, т.к. элементов всего 5, то 4 в качестве первого значения i - это просто конкретное значение.
В моем понимании "i" в строчке 7 - это длинна массива, а "j" - это конкретное значение массива такого-то индекса. Так ли это?
И то и другое неправильно.
i и j - это индексы массива, а не длина и не значение.
Зачем нужен i, я писал тебе в конце прошлого ответа. Мы могли бы вообще не заводить никакого i, убрать внешний цикл, и оставить только внутренний, но сделать его не до "i", а до (spisok.length - 1)*(spisok.length - 1), то есть внутренний цикл пробежал бы не 10 кругов, а 16, (4*4), притом последние 6 он бы ничего не менял местами, т.к. все уже точно упорядочено. Просто чтобы не делать лишнюю работу, мы завели i, которое постепенно уменьшаем.
i - это индекс последнего неотсортированного элемента массива, все что справа от i - отсортировано.
а j бегает по неотсортированным элементам и попарно их сравнивает, и меняет местами. j и j+1 - это индексы двух элементов, которые мы сейчас сравниваем.
Для наглядности сделай себе 5 карточек с числами, выложи перед собой в случайном порядке и прогони этот алгоритм, станет все ясно. Прям проговаривай, чему равно i, чему равно j, что j меньше i, чему равно значение на карточке под номером j, чему на карточке под номером j+1, меняй их местами, когда надо. Чтобы не путать индексы со значениями, напиши значения не от 1 до 5, а какие-нибудь двузначные. Все станет понятно через 10 минут, уверяю.
+2
Андрей
10 декабря 2019, 20:01
Мощно !!! Реально знания ! Вы только не обижайтесь, я сейчас карточек повырезаю -надвигаю, и отпишусь.
0
Андрей
11 декабря 2019, 08:42
Возник вопрос: Правильно ли я понял, что получается зависимость: число Индекса крайней правой ячейки массива внешнего цикла равняется количеству попарных сравнений которые происходят в внутреннем цикле, и одновременно количеству достаточных перестановок для получения нам нужной сортировки. Или это совпадение в конкретном примере?
0
hidden #598481
11 декабря 2019, 08:48
Если честно, немного не понял твоего вопроса. Если твой массив изначально отсортирован в другую сторону, то тебе понадобятся все десять перестановок для массива из 5 элементов.
0
Ksenia VolkovaJava Developer в DXCMaster
11 декабря 2019, 09:04полезный
Sorting Algorithms Dance
+1
Андрей
11 декабря 2019, 09:05
все верно, вырезал вчера, но вырубился. Передвигал только сейчас. Действительно, все 10. Sorting Algorithms Dance смотрел, но как видно не помогло. Бумажки помогли :)
0
Андрей
11 декабря 2019, 09:27
Vk СПАСИБО Тебе огромное !
0
hidden #598481
11 декабря 2019, 09:54
рад помочь!
0