首页 > 解决方案 > 如何在循环中获得正确的二进制数组以可视化冒泡排序?

问题描述

我试图用 JS 可视化冒泡排序。我使用二进制数组来保存每个更改的数组。但是在二进制数组中,我只得到已排序的数组。

var arr = [1, 5, 3, 7, 2];
var newArray = [];

for (var i = 0; i < arr.length - 1; i++) {
  for (var j = 0; j < arr.length - 1 - i; j++) {
    if (arr[j] > arr[j + 1]) {
      arr[j] = arr[j] + arr[j + 1];
      arr[j + 1] = arr[j] - arr[j + 1];
      arr[j] = arr[j] - arr[j + 1];
      console.log(arr);
      newArray.push(arr);
    }
  }
}

我不明白为什么当我控制台 arr[] 时我在循环中得到正确的结果,但是 newArray 是 [1, 2, 3, 5, 7],[1, 2, 3, 5, 7],[ 1、2、3、5、7]、[1、2、3、5、7]。

为什么在同一范围内控制台和推送功能会得到不同的结果?

我怎样才能得到正确的二进制数组?

我是新手,对此完全感到困惑。有人知道原因吗?谢谢

标签: javascript

解决方案


我并不完全清楚您到底要做什么,但我认为您的想法是newArray在排序的每一步都包含数组的快照。您的代码不起作用,因为您在每一步都将相同的数组推入。newArray您需要在每一步制作当前的副本。arr幸运的是,这可以通过以下方式轻松完成slice

        var arr = [1,5,3,7,2];
        var newArray = [];

        for (var i = 0; i < arr.length - 1; i++) {            
            for (var j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    arr[j]   = arr[j] + arr[j+1];
                    arr[j+1] = arr[j] - arr[j+1];
                    arr[j]   = arr[j] - arr[j+1];
                    //console.log(arr);
                    newArray.push(arr.slice(0,arr.length));
                }
            }
        }
console.log(newArray);
console.log(arr);
        

现在newArray是一个数组数组,其中包含排序的每个步骤的数组快照。


推荐阅读