插入排序和冒泡排序的比较

时间:2014-06-02 06:54:34

标签: algorithm sorting runtime bubble-sort insertion-sort

我试图找出这两种算法执行所花费的实际时间,以及我发现的与许多地方互联网上的信息不一致的地方,即插入排序更好。然而,我发现冒泡排序执行得更快。我的代码如下。

冒泡排序

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.对此有任何解释吗?

2 个答案:

答案 0 :(得分:3)

您实施的插入排序错误。应该是插入排序的代码甚至不对数组进行排序;例如,在输入上尝试

int a[] = {4, 2, 3, 1, 5};

给出输出

[2, 3, 1, 4, 5]

观看演示:http://ideone.com/aFCPft

鉴于代码不起作用,时序数据并没有告诉我们多少。

答案 1 :(得分:0)

你排序了多少元素? 只是为了确保没有模糊不变的成本与我通常采用的方式一样,就像这些测试的longint.max元素一样。 此外,如果您排序的元素不够,那么就可能在那时您的CPU因某种原因而忙碌。使用更多元素,错误源不太相关。

但是,听起来很奇怪。也许有一些针对愚蠢循环的编译器优化不适用于优化循环?

出于好奇:您是否尝试使用32位和64位应用程序?结果有时可能不同:O