【发布时间】:2020-09-07 12:44:23
【问题描述】:
更新 我无法弄清楚这是什么问题,但我找到了解决我的整体问题的方法。我只是将我的 bubbleSort() 算法更改为仅使用 for 循环,这似乎有效。感谢您的帮助!
我目前正在学习 javaScript 和 React。作为一个实践项目,我正在尝试创建一个排序算法可视化工具。对于(我认为是简单的)热身,我首先使用我在网上找到的伪代码实现了冒泡排序。我有它,所以数组在屏幕上进行排序和更改,但它太快了,所以它没有显示过程的实际动画,说明它是如何到达那个点的。为了做到这一点,我需要延迟算法中循环的每次迭代。但是,我的实现表现得很奇怪。显示动画正在排序的第一个迭代,然后突然停止。当我将 setTimeout() 添加到我的函数时,该算法似乎提前退出而不是完成整个过程。要完成整个排序过程,您需要反复按下按钮,直到每个项目都被排序。我尝试的任何方法似乎都不起作用,如果有人能解释原因并提供一些帮助,我将不胜感激。
bubbleSort() {
var arr = this.state.array
var isSorted = false
var lastUnsorted = arr.length - 1
while (!isSorted) {
isSorted = true;
for (let i = 0; i < lastUnsorted; ++i) {
setTimeout(() => {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1)
isSorted = false
}
this.setState({ array: arr })
}, i * 1);
}
lastUnsorted--
}
this.setState({ array: arr })
}
【问题讨论】:
-
setTimeout的延迟参数是毫秒数,因此您可能希望将该因子从 1 增加到 500 或 1000。此外,setTimeout不会暂停执行时,它将异步、并行地运行回调中的代码。 -
嘿 Bryan,您可能想考虑使用函数调用自身,直到它被排序并且您可以使用
setTimeout调用函数?我不确定它将如何与 React 和 states 一起使用,但我猜值得一试 =) -
这是因为延迟函数没有运行,并且它们都没有在循环中清除
isSorted标志 - 保持真实,而循环中断......你可以使用状态变量来做这个动画,不局部变量...每次迭代都遵循延迟检查if( ! this.state.isSorted ) this.repeatLoop()
标签: javascript reactjs for-loop while-loop settimeout