【问题标题】:JavaScript bubble sort modification (Looping `i` stops before the sorting ends.)JavaScript 冒泡排序修改(在排序结束前循环 `i` 停止。)
【发布时间】:2025-11-22 12:05:02
【问题描述】:

这是我的第一个问题。我研究的是 JS 中的冒泡排序实现。

似乎代码无法正常工作。 请帮我解决它

pen link

var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];
var n = arr.length;
var t;
var swap = true;

for (var i = 0; (i < n) && (swap === true); i++) {
  for (var j = 0; j < (n - (i + 1)); j++) {
    if (arr[j] > arr[j + 1]) {
      t = arr[j + 1];
      arr[j + 1] = arr[j];
      arr[j] = t;
      swap = true;
    } else {
      swap = false;
    }
  }
};

【问题讨论】:

  • 去掉(swap === true)就可以了。这是干什么用的?
  • 这里有什么问题?您想知道排序完成后如何停止循环吗?为什么排序在某些情况下不起作用?还有什么?
  • @DanielBernsons 我想了解我的代码应该如何使我的想法在这个例子中发挥作用。那个好人帮助了我*.com/a/44877069/7360033 但无论如何,我很感激你试图帮助我

标签: javascript sorting bubble-sort


【解决方案1】:
var swap = true;
for (var i = 0; (i < n) && (swap === true); ++i) {
    swap = false;
    for (var j = 0; j < ( n - (i + 1) ); ++j) {
        if ( arr[j] > arr[j + 1] ) {
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;

            swap = true;
        }
    } 
}

一旦loopi没有交换任何数字,“swap”就会为假,然后我们就可以退出循环了。

【讨论】:

  • 欢迎来到 Stack Overflow!请看how to answer;特别是,如果您可以对您的解决方案进行一些解释,以便更好地理解您的结果为何有效,那就太好了。
  • @YibinQiu 谢谢你,你的回答是最准确的,你帮助我理解了我的代码应该如何使我的想法在这个例子中起作用。
  • @AlexanderReynolds 感谢您的建议,我一定会使用您的建议
【解决方案2】:

循环不知道数组何时排序,因此您不可能知道何时停止i 循环。

如果你想让冒泡排序起作用,你应该取出swap变量逻辑。

var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];
var n = arr.length;
var t;
var swap = true;

for (var i = 0; i < n; i++) {
    for (var j = 0; j < n; j++) {
        if (arr[j] > arr[j + 1]) {
            t = arr[j + 1];
            arr[j + 1] = arr[j];
            arr[j] = t;
        }
    }
};

但是完成冒泡排序的更好方法是this

【讨论】:

    【解决方案3】:

    如果您想提前中断外循环,您可以使用 Javascript 中的标签来完成此操作。

    outer:
    for (var i = 0; i < n; i++) {
    
        inner:
        for (var j = 0; j < (n - (i + 1)); j++) {
    
            if (arr[j] > arr[j + 1]) {
                t = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = t;
            } else {
                break outer;
            }
    
        }
    };
    

    MDN Doc for label 确实表明这些非常罕见,但它们正是为此目的而设计的。

    另请注意,我没有查看您的冒泡排序算法的准确性或其他方面 - 如果您对此有疑问,那么 Junaid Ahmed 的回答可能会为您提供更好的帮助。

    【讨论】:

      【解决方案4】:

      Yibin Qiu had answered for my question

      他的回答是最准确的,他帮助我理解了我的代码应该如何使我的想法在这个例子中发挥作用。

      var arr = [11, 12, 0, 1, 2, 4, 3, 5, 7, 6, 8, 9, 10, 13];
      
      var n = arr.length, t, swap = true;
      
      for (var i = 0; (i < n) && (swap === true); ++i) {
      
          swap = false;
      
          for (var j = 0; j < ( n - (i + 1) ); ++j) {
      
              if ( arr[j] > arr[j + 1] ) {
                  t = arr[j];
                  arr[j] = arr[j + 1];
                  arr[j + 1] = t;
                  swap = true;
              }
      
          console.log('swap = ' + swap);
          } 
      console.log('j = ' + j);
      console.log('i = ' + i);
      };
      

      【讨论】: