关于算法:二进制插入排序和复杂度

Binary insertion sort and complexity

我有一个关于在插入排序算法中使用二进制搜索的简单问题。更准确地说,在常规插入排序的每个步骤中,我们没有线性比较该元素与先前(排序的)子数组中的所有元素,而是仅在该排序的子数组中使用二进制搜索来查找该元素所属的位置。

我知道这减少了算法进行的比较次数(O(log n)而不是O(n)),但是每一步所需的交换次数仍然占主导地位,复杂度仍然为O(n ^ 2)。

我还知道,复杂度与运行时间并不那么容易。我试图比较两种算法的n值(数组大小)"小"值(最多约500000)的运行时间。二进制插入排序总是比通常的插入排序快。

两者均为O(n ^ 2)的事实告诉我,当n足够大时,运行时间应该相似,对吗?在这种情况下,有多少"足够大"才能真正看到相似的运行时间?


The fact that both are O(n^2) tells me that as n gets large enough, the running time should be similar, right?

小心-这不是真的。当n变大时,n^22n^2永远不会靠近。他们越来越远。但两者都是O(n^2)

那么,说两个算法都是O(n^2)是什么意思?好吧,这意味着最终每个人都可以被n^2的某个恒定倍数所限制。对于您的二进制插入排序,它可能是10n^2,而对于您的标准插入排序,它可能是1000n^2。两者均为n^2,尽管效率可能相差100(在此示例中)。

复杂性不仅可以告诉您某个特定函数的行为,还可以告诉您该函数与其他函数的堆叠方式。例如,如果您知道函数是O(n^2),则对于n的较大值,f(n+1)的增长将不超过某些恒定时间n + 1(为什么?因为n^2的导数是2n(线性),它告诉您连续项之间的差异呈线性增长)。


理论上,二进制插入排序的复杂度为O(log_2(n!)),
Wolframalpha。

这在O(n2)和O(n log(n))之间,实际上更接近O(n log(n))。