如何实现不同数组规模的逆序数统计?排查循环异常问题
问题排查与代码修正
1. 无限循环的核心原因
外层循环出现无限循环是两个低级错误导致的:
- 初始值错误:伪代码要求从5000开始,你写的是
int n = 0 - 赋值运算符错误:
n =+ 5000是直接把5000赋值给n(等同于n = 5000),而非累加操作,正确的累加运算符是n += 5000
这两个错误导致循环变量n始终停留在5000,永远满足n < 50000的条件,陷入无限循环。
2. 其他逻辑修正点
除了无限循环,代码还有几处不符合伪代码逻辑的问题:
- 数组大小未关联当前循环的
n:你用了固定的arrSize,应该每次根据当前n创建对应大小的新数组 - 缺少总耗时累加与平均计算:伪代码要求统计10次运行的总耗时并输出平均值,你的代码只打印了单次耗时
- 存在冗余初始化:外层循环里的第一个数组初始化是重复操作,内层循环已经完成了这个步骤
3. 修正后的完整代码
public class InversionCountTimer { private static final int NUMSEXP = 10; public static void main(String[] args) { // 修正外层循环:覆盖5000-50000,步长5000 for (int n = 5000; n <= 50000; n += 5000) { long totalTime = 0; int count = 1; // 执行10次实验 for (int j = 0; j < NUMSEXP; j++) { // 根据当前n创建新数组并填充随机数 int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = (int) (Math.random() * (10 * n)); } long startTime = System.nanoTime(); // 运行逆序数统计与排序算法 int inversionCount = countInversionAndSort(arr, 0, arr.length - 1); long endTime = System.nanoTime(); // 累加总耗时 totalTime += (endTime - startTime); // 打印单次实验结果 System.out.println(count++ + " Inversion Count: " + inversionCount); System.out.println("Elapsed Time in Nano seconds: " + (endTime - startTime) + "\n"); } // 计算并输出当前数组规模的平均耗时 long averageTime = totalTime / NUMSEXP; System.out.println("=== Array Size: " + n + ", Average Time (nanoseconds): " + averageTime + " ==="); System.out.println("----------------------------------------\n"); } } // 此处为你已实现的逆序数统计与排序方法 private static int countInversionAndSort(int[] arr, int left, int right) { // 替换为你的实际实现逻辑 return 0; } }
4. 关键修正说明
- 外层循环:
for (int n = 5000; n <= 50000; n += 5000),确保覆盖所有目标数组规模,步长正确累加 - 数组创建:每次循环根据当前
n创建新数组,避免固定大小数组的越界或无效数据问题 - 耗时统计:新增
totalTime变量累加每次运行耗时,最后计算平均耗时,完全符合伪代码要求 - 冗余清理:移除外层循环中重复的数组初始化代码,减少不必要的性能开销
内容的提问来源于stack exchange,提问作者leomarrg1
相关产品推荐
相关产品推荐

