我正在使用Collections.sort
自定义比较器类。我听说这有O(N log N)
运行时复杂性。我很想知道当集合没有改变时后续排序会发生什么。
例如,假设我有一个Egg
s的ArrayList,每个都有一个近似size
字段(我的比较器按其排序)。如果我在阵列列表中插入十个鸡蛋并对其进行排序,我可以预计它会花费O(N log N)
时间。
如果我再次对其进行排序,而不添加,删除或更改任何元素,它还需要N log N
时间吗?
答案 0 :(得分:2)
Javadoc表示'如果低子列表中的最高元素小于高子列表中的最低元素,则省略合并'。这似乎意味着什么都没有发生,所以应该更快。
你总是可以测试它。
答案 1 :(得分:1)
我还没有分析当前sun java库中的代码。但是,javadoc声明使用了合并排序。大多数合并排序在已排序的集合上产生O(n)性能。虽然文档中没有说明这一点。我的个人经历表明我在排序或近乎排序的列表上表现非常出色。
答案 2 :(得分:0)
Per JavaDoc Collections.sort使用合并排序算法。
你可以在这里看到它是如何做的 - > http://www.sorting-algorithms.com/
答案 3 :(得分:0)
要扩展EJP的答案,如果文档指出合并传递是跳过的步骤,那么在这种最佳情况下运行时将是LG N,因为它仍然会将列表分解为LG N子问题。与线性扫描的乘法是效率的提高。