为什么外壳排序的时间复杂度会在我的数据中记录?

时间:2018-09-27 07:40:39

标签: python algorithm sorting time-complexity shellsort

环境:python3.6,Anaconda 5.1,Jupyter笔记本,numba。

我使用了Python生成的随机数组来测量shell排序的时间复杂度,但是发现其时间复杂度更符合NlogN。 我知道shell排序的时间复杂度是O(n ^ 2),我很困惑。

Shell排序代码:

def shell_sort(list):
    n = len(list)
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            temp = list[i]
            j = i
            while j >= gap and list[j - gap] > temp:
                list[j] = list[j - gap]
                j -= gap
            list[j] = temp
        gap = gap // 2
    return list

shell sort time complexity analysis

2 个答案:

答案 0 :(得分:0)

O(n ^ 2)仅是最坏情况下的时间复杂度,因此该算法可以比在随机输入上甚至平均(甚至在几乎所有输入上……)运行的时间更少。

Shellsort的复杂程度还取决于您选择的"gap sequence"

某些间隙序列会导致最坏的时间比O(n ^ 2)小,例如间隙序列1, 2, 3, 4, 6, 8, 9, 12, ...的O(n ^ 1.5)甚至{}的O(nlog ^ 2(n)) {1}}(均应归因于Pratt,1971年)。换句话说:仅尝试一个输入就根本不重要,根据算法的确切实现,关于O(n ^ 2)的主张可能是错误的。

答案 1 :(得分:0)

与Shell排序复杂性相关的问题很多,人们怀疑,通过适当选择参数和某些输入,其复杂度可能为O(n.logn)。