Задать вопрос
PavelScron
@PavelScron

Вопрос по циклу JS и массиву — почему так?

Почему во вложенном цикле i-1, ведь и без -1 работает?

function bubbleSort(arr){
  var noSwaps;
  for(var i = arr.length; i > 0; i--){
    noSwaps = true;
    for(var j = 0; j < i - 1; j++){
     console.log(arr, arr[j], arr[j + 1], 'i and j', i, j); // 
      if(arr[j] > arr[j+1]){
        var temp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temp;
        noSwaps = false;         
      }
    }
    if(noSwaps) break;
  }
  return arr;
}

alert(bubbleSort([8,1,2, 9]));
  • Вопрос задан
  • 145 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
dollar
@dollar
Делай добро и бросай его в воду.
Потому что arr[j] сравнивается с arr[j+1]. Это два элемента подряд. Значит, j должен проходить не от 0 до максимума, а от 0 до максимума минус 1.

Если сделать условие j < i, то будет лишняя операция, которая не нужна, хоть и не мешает. Просто у нас от i до arr.length уже отсортированный массив. Поэтому a[j+1] будет равно a[i], но a[i] уже точно на своём месте и его никуда двигать не нужно. Поэтому это просто лишняя операция, для которой arr[j] > arr[j+1] будет заведомо ложно.
Ответ написан
Комментировать
@choupa
Архитектор (обычный, который строит)
Внешний цикл начинается с индекса несуществующего элемента i = arr.length. Максимальный элемент массива это arr[ arr.length-1 ]. Внешний цикл надо начать с i = arr.length-1.

Тем не менее в коде всё равно присутствуют отсылки к несуществующим элементам массива в arr[ j+1 ], когда j = i-1, т.е. опять-таки запрашивается arr[ arr.length ]. Благо, что if возвращает false, когда arr[ j+1] оказывается undefined, и всё работает. Но это криво, неправильно, и вообще.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы