在java中,collections.sort使用合并排序算法而不是快速排序算法。但是Arrays.sort使用快速排序。(我不确定上述事实,但我在互联网上发现,如CodeRanch等网站,如果他们不使用该算法,请告诉我)
现在我知道这两种算法的平均复杂度是一样的。只有事实是最快的,最差的是O(n^2),但这并不常见。我们不关心当今世界的空间,所以合并排序不是就地算法并不重要。但是我们关注的是稳定性,所以我们为什么对array.sort使用快速排序,因为它不是一个稳定的算法。是因为它只关心整数,但我不认为这是一个好的理由。
发布于 2015-04-22 00:46:38
您的前提可以很容易地通过查看相关的爪哇,甚至源代码来验证。首先,请注意,Collections.sort(List)只是简单地委托给Arrays.sort(Object[]) (来源):
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}因此,这两个方法将具有相同的行为和运行时。正如文档中所指出的,实现是TimSort (合并排序和插入排序混合)。它保证是稳定的。因此,无论您有数组还是集合,排序对象的工作方式都是一样的。
您所链接的文章所指的是对基元数组进行排序。对于基元数组,需要做的假设较少,特别是从定义上来说,相同的基元是不可区分的。这意味着没有必要确保一个稳定的类型。您将注意到原始排序方法(如Arrays.sort(int[]) )的文档没有提到这些排序方法的稳定性,因为这样的细节是没有意义的。只有当排序数据可以相等但不相同时,稳定性才重要。
发布于 2015-04-22 00:38:21
Arrays.sort只对基元数组使用双枢轴快速排序算法,其中稳定排序算法和不稳定排序算法没有区别。这通常被认为是稍微快,但它是不稳定的,所以它只使用在稳定是无关的情况下。
对象数组上的Arrays.sort和Collections.sort使用时间排序,这是一个进行稳定排序的合并变体。
发布于 2015-04-22 00:31:13
Arrays.sort将比Collections.sort稍快一些,因为Collections.sort内部调用Arrays.sort。在处理原语时,稳定性不相关,因为具有相同价值的原语可以重新排列,而不会产生副作用。Arrays.sort提供了额外的性能优势。因此,对于基元数组,最好使用Arrays.sort。
https://stackoverflow.com/questions/29785544
复制相似问题