2

我有几个关于壳牌排序与壳牌差距的问题在网上找不到。

public static void shell(int[] a) {
    int increment = a.length / 2;
    while (increment > 0) {
        for (int i = increment; i < a.length; i++) {
            int j = i;
            int temp = a[i];
            while (j >= increment && a[j - increment] > temp) {
                a[j] = a[j - increment];
                j = j - increment;
            }
            a[j] = temp;
        }
        if (increment == 2) {
            increment = 1;
        } else {
            increment *= (5.0 / 11);
        }
    }
}

这是我在网上找到的代码,但我不太明白最后一个else语句。5.0/11 代表什么?我还需要分析算法的复杂性,尽管我收到了相当令人困惑的结果:

结果

似乎最好和最坏的情况都是 O(n)。这些结果合法吗?

4

1 回答 1

0

5.0/11 实际上是用来获取增量的一半。任何 <0.5 和 >0.45 都可以得到整数值的一半。

于 2018-04-07T19:59:25.977 回答