JavaScript массив сортирует сам - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь написать анимацию пузырьковой сортировки - для этого я хочу поместить все итерации в отдельный массив и затем воспроизвести их. Но переменная array ведет себя странно - все выходные данные console.dir(array) являются отсортированными массивами, поэтому в pool представляется 9 идентичных массивов [[1 ,2 ,3], [1, 2, 3] ... ] Я ожидаю увидеть всю итерацию алгоритма сортировки: [[2, 3, 1], [2, 1, 3] ... ]]

Может кто-нибудь сказать мне, что я делаю неправильно, и самое главное, почему массив array всегда сортируется?

Примечание : здесь работает фрагмент, но он не работает работает неправильно в браузере или jsfiddle

Фрагмент кода:

    const pool = [];
    const bubbleSort = (array) => {
      const len = array.length;
      for (let i = 0; i < len; i++) {
        for (let j = 0; j < len; j++) {
          if (array[j] > array[j + 1]) {
            const tmp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = tmp;
          }
          pool.push(array);
          console.dir(array);
        }
      }
    }

    bubbleSort([3, 2, 1]);
    console.log(pool);

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Я думаю, что решение связано с тем, что массивы JavaScript поддерживают что-то вроде ситуации "передачи по ссылке", когда вы кладете sh в стек pool. Вы можете попробовать

pool.push(array.slice()); // This creates a new instance of the array

Вы также можете прочитать эту документацию для уточнения изменчивости массивов

0 голосов
/ 28 февраля 2020

Вы должны понимать две вещи:

  • переменная array ссылается на изменяемый массив. Это означает, что каждый раз, когда вы меняете два элемента, массив изменяется
  • , когда вы делаете pool.push(array), вы получаете sh a ссылку на pool.

В вашем коде вы sh n раз используете одну и ту же ссылку в pool. Итак, у вас есть только 2 массива в памяти: pool и array (т.е. [3,2,1] в вашем примере)

Каждый раз, когда вы изменяете array (путем замены элементов), вы изменяете все массивы (на самом деле уникальный массив), хранящийся в пуле.

Итак, если вы хотите сделать снимок, вам нужно сохранить копию вашего массива в пуле: pool.push(array.slice())

Что касается "странного" поведения console.dir, это происходит из-за асинхронного характера этой функции. См. console.log () asyn c или syn c?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...