为什么我的排序算法比#34;算法简介"由H.Cormen预订?

时间:2016-04-12 09:56:47

标签: java algorithm insertion-sort

我从昨天开始学习这本书,在我理解并应用了第一个算法之后,我试着独自一人,以不同的方式看待。在Java中,这里显示了算法:

public static int[] sort(int[] array)
{
    for(int i = 1; i < array.length; i++){
        int value = array[i];
        int j = i - 1;

        while(j >= 0 && array[j] > value){
            array[j + 1] = array[j];
            j--;
        }
        array[j+1] = value;
    }

    return array;
}

这是我的:

public static int[] sortb(int[] array)
{
    for(int i = 0; i < array.length; i++){
        int value = array[i];
        int j = i;

        while(j < array.length && value > array[j]){
            array[j] = array[j + 1];
            j++;
        }

        array[j] = value;
    }

    return array;
}

对于每个函数调用100万个,第一个函数为32毫秒,第二个函数为25毫秒。我仍然从算法开始,所以我不知道其含义。

2 个答案:

答案 0 :(得分:6)

我发现为什么你的排序比原始排序快得多:因为你根本就没有排序。

在您的代码中

    int value = array[i];
    int j = i;

    while(j < array.length && value > array[j]) { ... }

因为j = i,所以在进入while循环之前value == array[j],因此你的while循环体永远不会执行。你的排序结果将是错误的。这是您的代码速度极快的主要原因。

答案 1 :(得分:5)

根据我的经验(阅读学生的经历),这种不同的价值观没什么意义。

也许你有一个后台进程从一个到另一个接受/释放了更多的资源。

也许你试图安排的具体案例对于其中一个algorythms比另一个更好。

也许,如果你使用不同的随机数组,其中一个比其他数组更接近排序..

要采取好的措施,通常需要做很多测试,而不仅仅是一个。例如,每个生成1k个10k元素的数组,并用这两个algorythms对每个数组进行排序。

无论如何,有时语言或编译器的特定特性可以为algorythms生成不同的结果,理论上完全相同的复杂度(一个例子:如果你遍历一个二维数组我曾在C ++中注意到首先是列,然后按行,你的速度会比你反过来的速度快得多;但是我不记得哪一个更快了。)