Java 集合。后续排序的排序性能?

Java 集合。后续排序的排序性能?,java,performance,sorting,Java,Performance,Sorting,我正在使用集合。使用自定义比较器类对进行排序。我听说这具有运行时复杂性。我很想知道当收集没有改变时,后续排序会发生什么 例如,假设我有一个Eggs的数组列表,每个数组列表都有一个近似的size字段(我的比较器按该字段排序)。如果我在数组列表中插入十个鸡蛋,并对其进行排序,我可以预期它需要O(N logn)时间 如果我在不添加、删除或更改任何元素的情况下再次对其进行排序,是否仍需要N log N时间?我没有分析当前sun java库中的代码。但是,javadoc声明使用了合并排序。大多数合并排序在

我正在使用
集合。使用自定义比较器类对
进行排序。我听说这具有运行时复杂性。我很想知道当收集没有改变时,后续排序会发生什么

例如,假设我有一个
Egg
s的数组列表,每个数组列表都有一个近似的
size
字段(我的比较器按该字段排序)。如果我在数组列表中插入十个鸡蛋,并对其进行排序,我可以预期它需要
O(N logn)
时间


如果我在不添加、删除或更改任何元素的情况下再次对其进行排序,是否仍需要
N log N
时间?

我没有分析当前sun java库中的代码。但是,javadoc声明使用了合并排序。大多数合并排序在已排序的集合上产生O(n)性能。尽管文件中没有说明这一点。我的个人经验表明,在排序或接近排序的列表上,我的性能非常好。

Per JavaDoc Collections.sort使用合并排序算法

您可以自己在这里看到它是如何运行的->

上面说“如果低位子列表中的最高元素小于高位子列表中的最低元素,则忽略合并”。这似乎意味着什么也没有发生,所以应该更快


您可以随时测试它。

要扩展EJP的答案,如果文档表明合并过程是跳过的步骤,那么在这种最佳情况下,运行时将是LG N,因为它仍然会将列表分解为LG N子问题。与线性扫描相乘是效率的提高

我希望不用测试就能发现:)