【问题标题】:JavaScript bubble sort modification (condition of the loop "for" is not working)JavaScript 冒泡排序修改(循环“for”的条件不起作用)
【发布时间】:2017-07-02 19:16:59
【问题描述】:

当循环“j”的 if 语句返回 swap = false 时,循环“i”必须中断,但它没有这样做,并继续执行所有 arr.length

bubble sort pen link

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

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 }
}
};

【问题讨论】:

    标签: javascript sorting bubble-sort


    【解决方案1】:

    这一行

    for (var i = 0; (i < n) && (swap = true); i++) {
    

    为swap赋值(即swap = true),而您实际上想要检查它的值(即swap === true)。

    请注意,swap 最初是未定义的,因此如果您按照上述方式更改代码 (swap === true),您可能需要在进入循环之前将其显式设置为 true。

    【讨论】:

    • 谢谢,您的回答是正确的,对我打破循环“i”的想法很有帮助。但我的想法是错误的。并且此检查不适用于数组的所有可能值。在某些情况下不会进行排序。例如'var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];'
    【解决方案2】:

    你可以使用break;停止 for() 循环的语句 Have a look here

    var arr = [0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13];
    var n = arr.length;
    var t;
    var swap = true;
    
    for (var i = 0; i < n; i++) {	
    	if (!swap) {
    		break;
    	}
    	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 {
    			swap = false;
    		}
    	}
    };
    alert(performance.now());
    alert(arr);

    【讨论】:

    • 谢谢,但为什么我的代码不起作用?我的错误在哪里?当排序完成时,我需要停止循环“i”
    • 对不起,我只是举一个例子来帮助你,改变: - 将交换设置为真 - 在 for() 语句中删除交换测试 - 如果交换为假,则在循环内测试交换以打破它
    • 另一个编辑,我删除了中断;从第二个循环
    • 感谢您的回答是正确的,并且有助于我打破循环“i”的想法。但我的想法是错误的。并且此检查不适用于数组的所有可能值。在某些情况下不会进行排序。例如'var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];'
    • 如果您需要更多类似这样的功能,您应该考虑使用 Lodash(首选)或 Underscore 可能
    【解决方案3】:

    correct answer by duncan smith

    这一行

    for (var i = 0; (i < n) && (swap = true); i++) {
    

    为交换分配一个值(即swap = true),而您实际上想要检查它的值(即swap === true)。

    请注意,swap 最初是未定义的,因此如果您按照上述方式更改代码 (swap === true),您可能需要在进入循环之前将其显式设置为 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2018-06-30
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多