Java - 在已排序的列表上调用sort()进行O(1)操作?

时间:2012-04-28 21:23:04

标签: java sorting

Collections.sort(list)是否已检查list是否已经排序,或者出于其他原因可能是O(1)?
或者,在调用true /向列表中添加元素时,将标志排序并将其设置为false / sort()是否是一个好主意?< / p>

4 个答案:

答案 0 :(得分:9)

如何在不查看列表的情况下确定是否排序?它不会是O(1)。确定列表是否已排序至少需要O(n)

这意味着如果Collections.sort确实无法检查列表是否已排序,则每个排序操作的平均值为O(n) + O(n log n)

答案 1 :(得分:5)

事实上,对于Java7,Java已经从mergesort切换到TimSort(以python开发人员Tim Peters的名字命名,他们首先为cpython实现了它),用于某些排序任务。

虽然它不是O(1),但使用TimSort对已经排序或部分排序的列表进行排序比排序完全随机的数据集要有效得多(对于后者,没有办法比O(n log n)更有效率对于比较排序,对于非随机数据则不然。)

答案 2 :(得分:3)

没有办法是O(1),你无法检查集合的排序是否比O(n)快。拥有一面旗帜应该没问题,但在不知道你究竟在做什么的情况下很难说肯定。

答案 3 :(得分:2)

一般来说,对已排序的列表进行排序并不会使其更快(除了冒泡排序之类的简单排序)在某些情况下,预先排序的速度较慢。

对于Collections.sort(),对排序列表进行排序并不快。