Java:对 ArrayList 进行排序
在Java的标准库中,是否有一种方法可以允许人们就地排序,即使用额外的存储空间?ArrayList
O(1)
Collections.sort(List<T>)
不满足此要求,因为它
将指定的列表转储到数组中,对数组进行排序,然后循环访问列表,从数组中的相应位置重置每个元素。
如果标准库中没有任何内容,可以使用哪些第三方库来执行此操作?
在Java的标准库中,是否有一种方法可以允许人们就地排序,即使用额外的存储空间?ArrayList
O(1)
Collections.sort(List<T>)
不满足此要求,因为它
将指定的列表转储到数组中,对数组进行排序,然后循环访问列表,从数组中的相应位置重置每个元素。
如果标准库中没有任何内容,可以使用哪些第三方库来执行此操作?
您可以提取底层数组(例如反射)并对其执行Arrays.sort(array,0,list.size())。
Java 7 在对数组进行排序之前不会在 Arrays.sort() 中复制数组。在Java 6中,这意味着Java 6中的Collections.sort()实际上复制了底层数组TWICE来执行排序。
Collections.sort()
可以与任何列表实现一起使用,这就是为什么它不能正常工作的原因(就地合并LinkedList很困难并且牺牲了稳定性)。
如果您真的担心就地排序,则必须推出自己的排序功能。除非您的列表很长,否则它不值得您花时间。
Arrays.sort(Object[])
执行相同的 mergesort,并由内部调用(至少在 openjdk 中)Collections.sort()