You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

冒泡排序交换次数计数异常:返回初始值0的问题排查与解决

解决冒泡排序交换次数统计始终为0的问题

嘿,我之前写冒泡排序统计交换次数时也踩过一模一样的坑!你的count一直返回初始值0,大概率是两个原因之一:要么在实际执行元素交换的代码块里忘记给count自增,要么是循环的边界条件写错了,导致根本没进入交换逻辑。

常见错误点分析

  • 最容易犯的错:把count++放在了交换逻辑外面,或者完全漏掉了这行代码
  • 循环边界错误:比如内层循环没有排除已经排好序的尾部元素,导致循环没触发有效比较

修正后的完整代码

public static int sort(int arr[]) {
    int length = arr.length;
    int temp;
    int count = 0;
    // 外层循环:控制排序的总轮次,最多需要length-1轮
    for (int i = 0; i < length - 1; i++) {
        boolean swapped = false; // 优化标记:本轮是否发生过交换
        // 内层循环:每轮只比较到未排序的最后一个元素(尾部i个元素已排好序)
        for (int j = 0; j < length - i - 1; j++) {
            // 当前元素大于后一个元素时,执行交换
            if (arr[j] > arr[j + 1]) {
                // 执行元素交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                // 关键!交换发生时计数加1
                count++;
                swapped = true;
            }
        }
        // 如果本轮没有任何交换,说明数组已经完全有序,提前终止循环
        if (!swapped) {
            break;
        }
    }
    return count;
}

核心修正点说明

  1. 必须在交换逻辑内部计数:只有当arr[j] > arr[j+1]的条件成立、真正执行交换操作时,才给count加1,这是统计交换次数的核心逻辑
  2. 正确的循环边界:内层循环的j < length - i - 1确保每一轮都只处理未排序的部分,避免无效比较
  3. 可选的提前终止优化swapped标记可以在数组已经有序时提前退出循环,不影响计数结果,但能提升效率

验证示例

比如测试数组[3,2,1,4,5,0],运行这个方法会返回6,正好符合你预期的交换次数。

内容的提问来源于stack exchange,提问作者KenzoEngineer

火山引擎 最新活动