js数组push()错误

新手上路,请多包涵

小白想尝试一下使用JS实现一下基本的排序算法
在尝试过程中觉得一下子出结果不便于理解过程
所以就寻思着用一个数组来记录每次移动的结果
然后就发现最终打印的用来记录的数组各项相等

百思不得其解

<script>
//使用data数组记录每次交换
//BUG:打印出的data数组的项一致,都是排序后的结果数组
'use strict';
const arr = [1,23,4,54,655,65,7,67,6,9,3,2,3,23,232,3];
let data = [];
function BubbleSort(arr) {
    for (let i = 0; i <= arr.length - 1; i++) {
        for (let j = 0; j <= arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
                data.push(arr);
                
            }

        }
    }
    
}

function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

BubbleSort(arr);
console.log(data);

</script>
阅读 6.3k
4 个回答

data.push(arr)改为data.push(arr.slice(0))试试。。。。

var arr = [1,23,4,54,/*....*/]; 意思是,分配一段内存,里面存储1,23, 4, 54 ... 然后,arr只是存储了这段内存的标识。

arr[1] = 1; 意思是把arr标识那个内存的第2个位置,修改为1,也就是说标识arr并没有改变,只是依旧是指向这段内存。

data.push(arr) 都是保存的这个标识,所以都是指向同一段内存。

因为你的arr其实已经是最终排序数组了,并不需要将其放入data

'use strict';
const arr = [1,23,4,54,655,65,7,67,6,9,3,2,3,23,232,3];
let data = [];
function BubbleSort(arr) {
    for (let i = 0; i <= arr.length - 1; i++) {
        for (let j = 0; j <= arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
            }
        }
    }
    data = arr;
}

function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

BubbleSort(arr);
console.log(data);

每次push的是data的引用,最后都指向的是一块内存空间,即排好序的arr.
可以如下修改:

'use strict';
const arr = [1,23,4,54,655,65,7,67,6,9,3,2,3,23,232,3];
let data = [];
function BubbleSort(arr) {
    for (let i = 0; i <= arr.length - 1; i++) {
        for (let j = 0; j <= arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
                data.push(arr.slice());
                
            }

        }
    }
    
}

function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

BubbleSort(arr);
console.log(data);




var arr = [1,23,4,54,655,65,7,67,6,9,3,2,3,23,232,3];
var data = [];
function BubbleSort(arr) {
    for (var i = 0; i <= arr.length - 1; i++) {
        for (var j = 0; j <= arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
                data.push([].concat(arr));
                
            }

        }
    }
    
}

function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

BubbleSort(arr);
console.log(data);

由于数组的每一项是基本类型,可以这样实现深复制~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题