【发布时间】:2016-10-17 20:07:50
【问题描述】:
我正在尝试在三种不同的输入中确定冒泡排序算法的运行时间:
1) 随机选择的数字
2) 已排序的数字
3) 以倒序号排序
我对他们的运行时间的期望是:
倒序数字比其他两个数字需要更长的时间。
已经排序的数字将具有最快的运行时间。
随机选择的数字将介于这两者之间。
我已经使用包含超过 100.000 个数字的输入测试了该算法。结果并不像我预期的那样。已经排序的数字具有最快的运行时间,但随机选择的数字的执行时间几乎是反向排序数字的两倍。我想知道为什么会这样?
这是我测试输入的方法
int[] random = fillRandom();
int[] sorted = fillSorted();
int[] reverse = fillReverse();
int[] temp;
long time, totalTime = 0;
for (int i = 0; i < 100; i++) {
temp = random.clone();
time = System.currentTimeMillis();
BubbleSort.sort(temp);
time = System.currentTimeMillis() - time;
totalTime += time;
}
System.out.println("random - average time: " + totalTime/100.0 + " ms");
totalTime = 0;
for (int i = 0; i < 100; i++) {
temp = sorted.clone();
time = System.currentTimeMillis();
BubbleSort.sort(temp);
time = System.currentTimeMillis() - time;
totalTime += time;
}
System.out.println("sorted - average time: " + totalTime/100.0 + " ms");
totalTime = 0;
for (int i = 0; i < 100; i++) {
temp = reverse.clone();
time = System.currentTimeMillis();
BubbleSort.sort(temp);
time = System.currentTimeMillis() - time;
totalTime += time;
}
System.out.println("reverse - average time: " + totalTime/100.0 + " ms");
【问题讨论】:
-
试图以这种方式对 Java 代码进行计时将产生有效的无用结果。有关如何正确执行此操作的一些信息,请参阅this question。
-
使用热身,即在不计时的情况下运行排序 100 次,然后慢慢来。对每个变体独立执行此操作,即不是一个接一个。关闭 GC。即使那样,结果也可能违反直觉。可以帮助解释逆序情况的一件事是branch prediction。