Java归并排序基准测试实现及随机数数组重复问题排查
问题原因与修复方案
为什么数组全是相同的随机数?
你用了Arrays.fill(a, rnd.nextInt()),这个方法的作用是把数组所有元素都设置成传入的同一个值。每次调用它,都会生成一个随机数,然后把整个数组的10个元素全部替换成这个数。再加上你嵌套了两层循环(外层1000次、内层10000次),每次内层循环都会重新把数组覆盖成新的随机数,最后数组里的所有元素就是最后一次调用Arrays.fill时生成的那个随机数,自然全是一样的。
正确的随机数组填充方式
要给数组每个元素生成不同的随机数,应该遍历数组的每个索引,逐个赋值:
for (int i = 0; i < a.length; i++) { a[i] = rnd.nextInt(); }
基准测试逻辑的优化建议
现在的代码循环了上万次填充数组,但最后只对最后一次填充的数组做了一次排序,完全达不到基准测试的目的——基准测试需要多次执行排序操作,统计平均耗时来避免偶然性。调整后的逻辑参考:
int arraySize = 10; int testTimes = 1000; // 测试次数 Random rnd = new Random(); MergeSort m1 = new MergeSort(); long totalTime = 0; for (int j = 0; j < testTimes; j++) { // 每次生成新的随机数组 int[] a = new int[arraySize]; for (int i = 0; i < a.length; i++) { a[i] = rnd.nextInt(); } // 执行排序并计时 long startTime = System.nanoTime(); m1.mergeSort(a, 0, a.length - 1); long endTime = System.nanoTime(); totalTime += (endTime - startTime); } // 计算平均耗时 long averageTime = totalTime / testTimes; System.out.println("平均执行时间(纳秒):" + averageTime); System.out.println("平均执行时间(毫秒):" + averageTime / 1000000);
内容的提问来源于stack exchange,提问作者Javaebeginner
相关产品推荐
相关产品推荐

