Java:对ArrayList进行排序

时间:2011-11-02 12:12:24

标签: java sorting arraylist

在Java的标准库中,是否有一种方法可以对ArrayList进行排序,即使用O(1)额外存储?

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

  

将指定的列表转储到数组中,对数组进行排序,并遍历列表,从数组中的相应位置重置每个元素。

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

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

Collections.sort()用于处理任何List实现,这就是为什么它不能正常工作(合并LinkedList很困难并牺牲稳定性)。

如果你真的担心就地排序,你将不得不推出自己的排序功能。除非你的名单很长,否则你的时间并不值得。

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

答案 2 :(得分:0)

从Java 8开始,List接口具有默认的void sort(Comparator<? super E> c) API,您可以使用该API对实例进行排序。

该列表必须是可修改的,可迭代的,并且其元素必须彼此可比。