【发布时间】:2014-07-16 05:45:11
【问题描述】:
我正在做关于排序算法效率的项目。假设我执行了 50 次冒泡排序迭代并找到 n 个数字所花费的平均时间。但我意识到前几次迭代总是比后续迭代慢
例如1394ms、1381ms、1001ms、1008ms、1008ms、1011ms...
long lStartTime = System.currentTimeMillis();
bubbleSort(R); // R is the array of int
long lEndTime = System.currentTimeMillis();
long difference = lEndTime - lStartTime;
这背后的原因可能是什么?是因为cpu能分辨出哪组数据要存入缓存吗? 如果是这样,我是否应该不使用后续计算时间进行分析,因为它不现实?
谢谢!
编辑:我也在做其他排序算法,以冒泡排序为例,但问题是它发生在我所做的所有排序中,除了插入之外
public static int[] bubbleSort(int[] S) {
int counter = 0;
boolean isUnsort = true;
while (isUnsort) {
isUnsort = false;
for (int i = 0; i < S.length - 1 - counter; i++) {
if (S[i] > S[i + 1]) {
int temp = S[i];
S[i] = S[i + 1];
S[i + 1] = temp;
isUnsort = true;
}
}
counter++;
}
return S;
}
【问题讨论】:
-
您的冒泡排序实现如何?冒泡排序可以提供 O(R) 到 O(R2) 之间的效率
-
这可能是由于Java中的JIT编译导致了这种情况。 JIT。但是,您的数组数据 R 是常数吗?不同的输入会产生不同的排序时间。
-
添加了冒泡排序代码。 R 大小是恒定的,数据是用 Math.random() 生成的。但总是前几次迭代比后续迭代慢,所以我怀疑这是由于输入
-
@RenFaKay JIT 应该是前几次迭代需要更长输入的原因。建议将它们过滤掉以进行计算。由于输入是随机的,因此计算时间也可能不同。