使用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());
,因为没有参数的切片只是克隆数组的一种快速方法。