Java:对 ArrayList 进行排序

2022-09-01 14:46:06

在Java的标准库中,是否有一种方法可以允许人们就地排序,即使用额外的存储空间?ArrayListO(1)

Collections.sort(List<T>) 不满足此要求,因为它

将指定的列表转储到数组中,对数组进行排序,然后循环访问列表,从数组中的相应位置重置每个元素。

如果标准库中没有任何内容,可以使用哪些第三方库来执行此操作?


答案 1

您可以提取底层数组(例如反射)并对其执行Arrays.sort(array,0,list.size())。

Java 7 在对数组进行排序之前不会在 Arrays.sort() 中复制数组。在Java 6中,这意味着Java 6中的Collections.sort()实际上复制了底层数组TWICE来执行排序。


答案 2

Collections.sort()可以与任何列表实现一起使用,这就是为什么它不能正常工作的原因(就地合并LinkedList很困难并且牺牲了稳定性)。

如果您真的担心就地排序,则必须推出自己的排序功能。除非您的列表很长,否则它不值得您花时间。

Arrays.sort(Object[])执行相同的 mergesort,并由内部调用(至少在 openjdk 中)Collections.sort()


推荐