为什么我的冒泡排序不对重复项进行排序并且只触发一次?
Why is my bubble sort not sorting duplicates and only firing once?
我正在用 React 构建一个排序可视化工具,但遇到了一个小错误。
我正在使用冒泡排序对随机生成的数字列表进行排序,条形的高度表示它们的数值(最大 600)。我希望它对整个列表进行排序,但它只会将最大的项目移动一次 onClick() ... 不仅如此,当涉及到重复值时我遇到了麻烦。重复项通常紧挨着放置,级联在该点之后从下一个最大值开始重新启动。如果没有重复生成,那么我只需要点击 sort()
几次,直到一切都转移到正确的位置,所以它只是半途而废。
- 重复项正在重置排序
sort()
每次点击仅 运行 一次
sort() {
const state = this.state.data;
let i = 0
let a = 0;
let b = a + 1;
do {
let aValue = this.state.data[a];
let bValue = this.state.data[b];
let aIndex = this.state.data.indexOf(aValue);
let bIndex = this.state.data.indexOf(bValue);
function swap(a,b) {
state.splice([aIndex], 1, b)
state.splice([bIndex], 1, a)
}
if(aValue > bValue && i <= state.length) {
swap(aValue, bValue)
}
a += 1;
b += 1;
i += 1;
} while (i < state.length)
this.setState({})
}
你可以先复制状态,然后只使用它来更清楚地了解正在发生的事情——在方法的最后你没有将状态设置为排序的结果,所以我在解决方案中添加了它。然后你不需要使用 indexOf
而是你应该使用你已经拥有的索引(例如 b
)——这就是你的排序与重复项斗争的原因,因为 indexOf
找到了数组中具有给定值的第一个元素的索引。此外,不是将索引传递给 splice
方法,而是将索引数组传递给 splice
方法(在我的解决方案中,我使用数组解构而不是 swap
函数)。在您当前的版本中,您只进行了一次冒泡排序 运行 迭代,但冒泡排序需要两个循环。要对所有内容进行排序,您需要反复迭代并跳过数组中已排序的最后 n 个元素。通过这些更改,您的排序方法可能如下所示:
sort() {
let i = 0
const state = [...this.state.data]
while (i < state.length) {
for (let b = 0; b < (state.length - i - 1); b++) {
if (state[b] > state[b + 1]) {
[state[b], state[b + 1]] = [state[b + 1], state[b]]
}
}
i += 1
}
this.setState({...this.state, data: state})
}
评论:抱歉,我在第一个回答中误读了你的问题,然后编辑了很多次。
我正在用 React 构建一个排序可视化工具,但遇到了一个小错误。
我正在使用冒泡排序对随机生成的数字列表进行排序,条形的高度表示它们的数值(最大 600)。我希望它对整个列表进行排序,但它只会将最大的项目移动一次 onClick() ... 不仅如此,当涉及到重复值时我遇到了麻烦。重复项通常紧挨着放置,级联在该点之后从下一个最大值开始重新启动。如果没有重复生成,那么我只需要点击 sort()
几次,直到一切都转移到正确的位置,所以它只是半途而废。
- 重复项正在重置排序
sort()
每次点击仅 运行 一次
sort() {
const state = this.state.data;
let i = 0
let a = 0;
let b = a + 1;
do {
let aValue = this.state.data[a];
let bValue = this.state.data[b];
let aIndex = this.state.data.indexOf(aValue);
let bIndex = this.state.data.indexOf(bValue);
function swap(a,b) {
state.splice([aIndex], 1, b)
state.splice([bIndex], 1, a)
}
if(aValue > bValue && i <= state.length) {
swap(aValue, bValue)
}
a += 1;
b += 1;
i += 1;
} while (i < state.length)
this.setState({})
}
你可以先复制状态,然后只使用它来更清楚地了解正在发生的事情——在方法的最后你没有将状态设置为排序的结果,所以我在解决方案中添加了它。然后你不需要使用 indexOf
而是你应该使用你已经拥有的索引(例如 b
)——这就是你的排序与重复项斗争的原因,因为 indexOf
找到了数组中具有给定值的第一个元素的索引。此外,不是将索引传递给 splice
方法,而是将索引数组传递给 splice
方法(在我的解决方案中,我使用数组解构而不是 swap
函数)。在您当前的版本中,您只进行了一次冒泡排序 运行 迭代,但冒泡排序需要两个循环。要对所有内容进行排序,您需要反复迭代并跳过数组中已排序的最后 n 个元素。通过这些更改,您的排序方法可能如下所示:
sort() {
let i = 0
const state = [...this.state.data]
while (i < state.length) {
for (let b = 0; b < (state.length - i - 1); b++) {
if (state[b] > state[b + 1]) {
[state[b], state[b + 1]] = [state[b + 1], state[b]]
}
}
i += 1
}
this.setState({...this.state, data: state})
}
评论:抱歉,我在第一个回答中误读了你的问题,然后编辑了很多次。