Python 为什么shell排序的时间复杂性在我的数据中是nlogn?

Python 为什么shell排序的时间复杂性在我的数据中是nlogn?,python,algorithm,sorting,time-complexity,shellsort,Python,Algorithm,Sorting,Time Complexity,Shellsort,环境:蟒蛇3.6,巨蟒5.1,巨蟒笔记本,麻木 我使用Python生成的随机数组来度量shell排序的时间复杂度,但发现它的时间复杂度更符合NlogN。 我知道shell排序的时间复杂度是O(n^2),我很困惑 外壳排序代码: def shell_sort(list): n = len(list) gap = n // 2 while gap > 0: for i in range(gap, n): temp = list[i

环境:蟒蛇3.6,巨蟒5.1,巨蟒笔记本,麻木

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

外壳排序代码:

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

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

Shellsort的复杂性也取决于您选择的类型


某些间隙序列导致的最坏时间情况小于O(n^2),如间隙序列
1,4,13,40,121,
的O(n^1.5),或
1,2,3,4,6,8,9,12,
的O(nlog^2(n))(均归因于Pratt,1971)。换句话说:仅仅尝试一个输入根本没有意义,关于O(n^2)的说法可能是错误的,这取决于算法的具体实现。

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

可能要发送代码?代码在哪里?但我的间距设置为2,这是最简单的一个。代码来自最基本的shell排序wikipeidia,这就是为什么我如此困惑的原因。@Xander nlogn属于O(n^2)因此,如果在某些情况下,甚至在许多情况下,时间更接近nlog而不是n^2,则没有问题。如果您有其他问题,则应发布用于生成随机数组的代码并计算平均时间。如果您的代码有问题,可能是因为您生成的不是实际随机数组,而是具有一定偏差的数组。我建议您使用20个随机数组样本测试每种大小(10-1000000输入容量)的平均时间,那么为什么是O(nlogn)而不是O(n^2)?那么你认为20个«随机»数组和一组数十亿或更多的数组是有代表性的吗?即使是这样,n^2是最坏的情况,那么随机选择集合排序可能是产生最坏情况的一种不好的方式。Giacomo回答了可能改变复杂性的间隙选择。