最佳情况下交换和比较的二进制插入排序复杂度

Binary Insertion sort complexity for swaps and comparison in best case

二进制插入排序的复杂度是多少?进行了多少次交换和比较?

可能是O(n(LG n))比较,但我不确定。最坏的情况下,确实是 N^2 掉期。最好的呢?

您可以利用内置函数轻松编写二进制插入排序,例如 bisect_left and list.pop(..) and list.insert(..) :

def bininssort(L):
    n = len(L)
    i,j=0,0
    for i in range(1,n):
        j=i-1
        x=L.pop(i)
        i1=bisect_left(L,x,0,j+1)
        L.insert(i1,x)
    return L

关于最坏的情况,因为在循环的 i-th 迭代中,我们在子数组 A[0..i]0<=i<n 中执行二进制搜索,这应该采取log(i) 操作,所以我们现在知道我们必须在位置 i1 插入一个元素并且我们插入它,但是插入意味着我们必须将它后面的所有元素向右推一个位置,并且这至少是 n-i 次操作(它可能超过 n-i 次操作,具体取决于插入位置)。如果我们只总结这两个,我们得到 \sum_{i=1}^n log(i) + (n-i) = log(n!) + (n*(n+1))/2 ~ n*log(n) + (n*(n+1))/2

(上面log(n!)Stirling's approximation被使用了)

现在the wiki page

As a rule-of-thumb, one can assume that the highest-order term in any given function dominates its rate of growth and thus defines its run-time order

所以我认为结论是,在最坏的情况下,二进制插入排序具有 O(n^2) 复杂性。

另请参阅:

然后我尝试检查它在反向(n,n-1,n-2,..,1)和交替(0,n-1,1,n-2,2,n-3,...)列表上的表现。我将它们(使用 matchgrowth module)拟合到不同的增长率,这部分只是一个近似值。倒序拟合多项式时间,交替序拟合拟线性时间

最好的情况是explained here。如果列表已经排序,那么即使我们不做任何交换,所有的二进制搜索仍在执行,这导致 O(n*log(n)).

此处使用的代码 is available 在此存储库中。