下面排序数组的定义来自Robert Sedgewick和Kevin Wayne的算法书。
如果反转次数为< = cN
,则对数组进行部分排序
不应该限制c的高度吗?我不能在技术上使c = 1000000000,现在很多未排序的数组在它们不应该被计算为部分排序时?我知道设置一个高c并不聪明,但不应该是某种范围?
这是最坏情况的一个例子。
D C B A
反转计数
1(d,c)
2(d,b)
3(d,a)
4(c,b)
5(c,a)
6(b,a)
对于大小为4,6个项目的数组。如果c = 2且6 我们何时达到N ^ 2范围?
答案 0 :(得分:2)
随机排列中预期的反转次数为 ~n 2 / 4 (例如,参见this question)。
Sedgewick的书涉及渐近的复杂性,其中的观点是“事物开始以大到足够大的方式行事”。因此,即使从您的问题中获取大的 c 值, c<< n / 4 ,足够大的 n 值。
然后你问小阵列怎么样。问题是,你可以问这个领域的任何部分,而不仅仅是排列。例如,基于比较的排序是Ω(n log(n)),并且对于某些特定实现来说,它恰好是 30 n log(n)+ 400 。但是,对于足够小的 n 值,* 30 n log(n)+ 400 < 5000000000000000000 * n *,因此您可以认为对于足够小的数组(具有常数5000000000000000000),排序是线性的。这是事实,但该领域的大多数人并不觉得它非常有用。 (这可能是因为随着时间的推移,CS处理的尺寸越来越大。)
答案 1 :(得分:2)
嗯,从技术上讲,c
有一个上限,因为你只能进行这么多的反转(即N(N-1)/2
)。
该算法针对N
进行了推广,c
不是N
的函数,它是常量。您需要根据您的要求确定c
。即使N^2
的某些值为N
,它仍然是常数,对于较高的值,它不会与N^2
相比较。因此,一般来说无法限制c
。
每当您感到有c
针对N^2
的特定值提出N
订单的冲动时,请执行此操作。然后保持c
固定并将N
提升几个数量级。无论它有多大,都可以享受恒定恒定的奢侈。
<强>更新强>
将最大反转键入N(N+1)/2
而不是N(N-1)/2
。现在修好了。