为什么我的冒泡排序不对重复项进行排序并且只触发一次?

Why is my bubble sort not sorting duplicates and only firing once?

我正在用 React 构建一个排序可视化工具,但遇到了一个小错误。 我正在使用冒泡排序对随机生成的数字列表进行排序,条形的高度表示它们的数值(最大 600)。我希望它对整个列表进行排序,但它只会将最大的项目移动一次 onClick() ... 不仅如此,当涉及到重复值时我遇到了麻烦。重复项通常紧挨着放置,级联在该点之后从下一个最大值开始重新启动。如果没有重复生成,那么我只需要点击 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})
    }

评论:抱歉,我在第一个回答中误读了你的问题,然后编辑了很多次。