如何统计循环条件检查次数?冒泡排序语句计数异常排查
冒泡排序语句计数问题排查
我正在开发一个统计算法执行语句数的程序,针对冒泡排序实现了计数逻辑,但测试包含3个元素的已排序列表(最佳场景)时,发现循环条件语句计数结果为6,而手动统计应为8——问题出在无法统计内层循环条件为false时的检查次数。
现有实现代码
public static Stats bubbleSort(List<String> names) { Stats stats = new Stats(); for (int x = 0; x < names.size() - 1; x++) { for (int y = x + 1; y < names.size(); y++) { if (names.get(x).compareTo(names.get(y)) > 0) { String temp = names.get(x); names.set(x, names.get(y)); names.set(y, temp); stats.inLineStatements += 3; } stats.ifStatements += 1; stats.updateExpressionStatements += 1; stats.conditionStatements += 1; } stats.updateExpressionStatements += 1; stats.conditionStatements += 1; } stats.conditionStatements += 1; stats.initializationExpressionStatements += 2; return stats; }
运行示例结果
Bubble Sort: Initialization Statements (For Loop): 2 Loop Condition Statements: 6 If Statements: 3 In Line Statements: 0 Update Expression Statements (For Loop): 5 Total Statements: 16
问题原因分析
当前代码中,内层循环的conditionStatements是在循环体内部累加,只有当循环条件判断为true、进入循环体时才会计数。但for循环的条件检查逻辑是:每次执行循环体前判断条件,当条件为false时退出循环——这最后一次的条件检查不会进入循环体,因此没有被统计到。
针对3个元素的已排序列表:
- 外层循环条件检查共3次(x=0、1时为true,x=2时为false),这部分通过循环体末尾+循环结束后的额外计数,已经完整统计。
- 内层循环:
- x=0时,y需检查3次(1<3、2<3、3<3),但当前仅统计了前2次进入循环体的检查;
- x=1时,y需检查2次(2<3、3<3),当前仅统计了第1次进入循环体的检查;
- 总共少统计2次内层循环的false条件检查,导致结果从8变成6。
修复方案
在每个内层循环结束后,额外累加一次conditionStatements,对应最后一次条件为false的检查操作。修改后的代码如下:
public static Stats bubbleSort(List<String> names) { Stats stats = new Stats(); for (int x = 0; x < names.size() - 1; x++) { for (int y = x + 1; y < names.size(); y++) { if (names.get(x).compareTo(names.get(y)) > 0) { String temp = names.get(x); names.set(x, names.get(y)); names.set(y, temp); stats.inLineStatements += 3; } stats.ifStatements += 1; stats.updateExpressionStatements += 1; stats.conditionStatements += 1; } // 新增:统计内层循环最后一次false的条件检查 stats.conditionStatements += 1; stats.updateExpressionStatements += 1; stats.conditionStatements += 1; } stats.conditionStatements += 1; stats.initializationExpressionStatements += 2; return stats; }
修复后,循环条件语句计数会变为8,与手动统计结果一致。
内容的提问来源于stack exchange,提问作者Sheryn C
相关产品推荐
相关产品推荐

