#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())