我试图找出这两种算法执行所花费的实际时间,以及我发现的与许多地方互联网上的信息不一致的地方,即插入排序更好。然而,我发现冒泡排序执行得更快。我的代码如下。
for(int j = 0; j < a.length - 1; j++){
for(int i = 0; i < a.length - 1 - j; i++) {
count++;
if(a[i] > a[i+1]){
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
for(int i = 1; i < a.length; i++){
for(int j = i - 1; j >= 0; j-- ){
if(a[j] > a[i]) {
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
我计算了开始和结束时间。
long startTime = System.currentTimeMillis();
.....your program....
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println(totalTime);
我发现,对于插入排序,10次运行的平均时间变为13次,对于冒泡排序,它变得只有5.对此有任何解释吗?
答案 0 :(得分:3)
您实施的插入排序错误。应该是插入排序的代码甚至不对数组进行排序;例如,在输入上尝试
int a[] = {4, 2, 3, 1, 5};
给出输出
[2, 3, 1, 4, 5]
鉴于代码不起作用,时序数据并没有告诉我们多少。
答案 1 :(得分:0)
你排序了多少元素? 只是为了确保没有模糊不变的成本与我通常采用的方式一样,就像这些测试的longint.max元素一样。 此外,如果您排序的元素不够,那么就可能在那时您的CPU因某种原因而忙碌。使用更多元素,错误源不太相关。
但是,听起来很奇怪。也许有一些针对愚蠢循环的编译器优化不适用于优化循环?
出于好奇:您是否尝试使用32位和64位应用程序?结果有时可能不同:O