使用javascript开发排序可视化工具。
我似乎无法将每次迭代完成的交换保存在交换历史记录中,但是如果我记录当前迭代的console.log(output)是否将数组swapHistory填充为最终输出?
我对此完全感到困惑

bubbleSort = (input) => {
    startTime = performance.now();
    var output = input;
    swapHistory = [];
    swaps = 0;
    let swap = false;
    do {
        swap = false;
        output.forEach((current, i) => {
            if (current > output[i + 1]) {
                const temp = current;
                console.log(current);
                console.log(output[i + 1]);
                console.log(output);
                swapHistory.push(output);
                output[i] = output[i + 1];
                output[i + 1] = temp;
                swaps++;
                swap = true;
            }
        });
    } while (swap);
    endTime = performance.now();
    timeTaken = endTime - startTime;
    console.log(timeTaken);
    setArray(output);
    $("#timeTaken").html("Time taken: " + timeTaken.toFixed(4) + "ms");
};


期望swapHistory数组将由交换的每次迭代填充

最佳答案

这是因为当您打算将output的当前值推送到swapHistory时,您是将output数组本身推送到swapHistory数组。本质上,当您想通过值传递时,您是通过引用传递的。

此处简单的解决方法是克隆output数组并将其保存在swapHistory中,而不是对output数组本身的引用。因此,将swapHistory.push(output);更改为swapHistory.push(output.slice());,因为没有参数的切片只是克隆数组的一种快速方法。

09-18 00:00