在Java的标准库中,是否有一种方法可以对ArrayList
进行排序,即使用O(1)
额外存储?
Collections.sort(List<T>)
不符合此要求,因为它
将指定的列表转储到数组中,对数组进行排序,并遍历列表,从数组中的相应位置重置每个元素。
如果标准库中没有任何内容,可以使用哪些第三方库来执行此操作?
答案 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对实例进行排序。
该列表必须是可修改的,可迭代的,并且其元素必须彼此可比。