计算反转以查看数组是否已部分排序

时间:2015-07-04 17:55:37

标签: arrays algorithm sorting

下面排序数组的定义来自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范围?

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。现在修好了。