为什么在一般情况下,链排序为O(n sqrt n)?

时间:2011-01-02 18:26:20

标签: algorithm sorting complexity-theory time-complexity

我发现strand sort非常有吸引力,可以在常量空间中对单个链表进行排序,因为它比例如插入排序要快得多。

我知道为什么在最好的情况下(列表已经排序)是O(n)而在最坏的情况下是O(n^2)(列表是反向排序的)。但为什么O(n sqrt n)在一般情况下呢?如果算法不是基于二分法并且具有多项式最佳情况和最差情况性能,则平均情况是O(n^m),其中m是最佳情况和最坏情况指数的算术平均值({ {1}},m = (1 + 2) / 2 = 3/2)?

2 个答案:

答案 0 :(得分:3)

对Strand排序的原始引用是http://groups.google.com/group/fido7.ru.algorithms/msg/26084cdb04008ab3 ...根据它,它是O(n ^ 2)。 Strand sort作为J sort的一个组件呈现,它声称是O(n lg n)。平均复杂度为O(n ^ 2)是有意义的,因为在随机数据中,一半链的长度为1,而O((n / 2)^ 2)= O(n ^ 2)。

答案 1 :(得分:0)

在您链接到的Wikipedia页面上,平均案例性能为O(n lg n),并引用此Stack Overflow页面。这很奇怪,因为在这个页面上没有任何地方可以这么说。

无论如何,为了进一步说明Ulrich的观点,平均案例分析很复杂,因为它必须考虑数据的平均表示方式,这不是一件容易的事。

来自维基百科:

  

确定平均输入意味着什么是困难的,并且通常平均输入具有使得难以用数学表征的特性(例如,考虑设计用于对文本串进行操作的算法)。类似地,即使对特定“平均情况”(可能仅适用于算法的某些用途)的合理描述是可能的,它们往往会导致更难以分析的方程式。