Сортировка чисел с помощью специальной функции в Javascript

#javascript

Вопрос:

У меня есть такой способ сортировки массива:

 const arr = [0,6,8,7,1,2,3];

const sortBubble = () => {
  for (let index = 0; index < arr.length; index  ) {
    for (let j = 0; j < arr.length; j  ) {
      if(arr[j] > arr[j 1]) {
        const temp = arr[j];
         arr[j] = arr[j   1]
         arr[j   1] = temp;
      }
    }
  }

  return arr;
}

console.log(sortBubble()) 

Также эта функция:

 const arr = [0,6,8,7,1,2,3];

const sortBubble = () => {
  for (let index = 0; index < arr.length; index  ) {
    for (let j = 0; j < arr.length; j  ) {
      if(arr[j] > arr[j 1]) {
         arr[j] = arr[j   1]
         arr[j   1] = arr[j];
      }
    }
  }

  return arr;
}

console.log(sortBubble()) 

Я не могу понять, почему в последней функции я получаю другой результат, чем в первой функции. Как вы можете видеть в последней функции, которую я не использовал: temp переменная, но в любом случае в моем видении temp и arr[j] должна быть равной, и я ожидаю, что в обеих функциях результат будет таким же, как в первой функции, но у последней другой результат.
Почему последняя функция действует по-другому, если я не использую temp переменную?

Комментарии:

1. arr[j] = arr[j 1] перезаписывает arr[j] . arr[j 1] = arr[j]; в следующей строке эквивалентно arr[j 1] = arr[j 1];

2. Значения в массиве являются числами, а не объектами, это означает, что когда вы присваиваете им значение, это фактическое значение, а не ссылка на объект (это не объект). Это означает, что вы должны сохранить текущее значение в temp var, и если вы не перезапишете его, исходное значение будет удалено.

Ответ №1:

Если вы внимательнее посмотрите на свой второй код, вы сделаете следующее:

       if(arr[j] > arr[j 1]) {
         arr[j] = arr[j   1]
         arr[j   1] = arr[j];
      }
 

Таким образом , вы устанавливаете arr[j] значение равно arr[j 1] , вторая строка не вносит изменений в массив, так как вы переписали arr[j] значение

Ответ №2:

Если вы хотите поменять местами элементы в массиве, вам необходимо использовать временную переменную в качестве буфера для хранения одного из двух значений, которые вы меняете местами:

Во втором примере предположим, что у вас есть этот массив:

 const arr = [5, 6];
 

Теперь давайте скажем j , равно 0 : arr[j] = arr[j 1] сделает ваш массив: [6, 6]

Затем вы выполняете arr[j 1] = arr[j] , что дает [6, 6] , и вы больше не можете получить 5 , так как на него больше нет ссылки.

Ответ №3:

arr[j] = arr[j 1] перезаписывает arr[j] . arr[j 1] = arr[j]; в следующей строке эквивалентно arr[j 1] = arr[j 1]; . Вы можете избежать явной temp переменной с помощью

 if(arr[j] > arr[j 1]) {
  [arr[j], arr[j   1]] = [arr[j   1], arr[j]];
}
 

но, конечно, внутренне временное значение должно быть сохранено.

Пример:

 const arr = [0,6,8,7,1,2,3];

const sortBubble = () => {
  for (let index = 0; index < arr.length; index  ) {
    for (let j = 0; j < arr.length; j  ) {
      if(arr[j] > arr[j 1]) {
         [arr[j], arr[j   1]] = [arr[j   1], arr[j]];
      }
    }
  }

  return arr;
}

console.log(sortBubble())