Java中的collection.sort()函数有多快?使用了什么算法?我遇到了这个函数in this answer,它按降序对列表进行排序:
public static void main(String arg[])
{
List<Double> testList=new ArrayList();
/*Adding The values to the List*/
testList.add(0.5);
testList.add(0.2);
testList.add(0.9);
testList.add(0.1);
testList.add(0.1);
testList.add(0.1);
testList.add(0.54);
testList.add(0.71);
testList.add(0.71);
testList.add(0.71);
testList.add(0.92);
testList.add(0.12);
testList.add(0.65);
testList.add(0.34);
testList.add(0.62);
/*Declare a new List for storing sorted Results*/
List<Double> finalList=new ArrayList();
while(!testList.isEmpty()) //perform operation until all elements are moved to new List
{
double rank=0;
int i=0;
for(double d: testList)
{
if(d>=rank)
{
rank=d;
}
}
finalList.add(rank);
testList.remove(testList.indexOf(rank));
}
for(double d : finalList) {
System.out.println(d);
}
}
我认为这在O(n(n-1))时间运行,对于大型列表来说效率非常低。考虑到效率低下,我不相信Collections.sort()的创建方式。
答案 0 :(得分:12)
来自Collection&#39方法sort()的文档:
实现说明:这个实现是一个稳定的,自适应的迭代
mergesort
,当输入数组被部分排序时,它需要远远少于n lg(n)的比较,同时提供传统mergesort的性能当输入数组是随机排序时。如果输入数组接近排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n / 2个对象引用不等。
这意味着最坏情况中的 O(n log n)。是的,它非常快(即使在最坏的情况下),比O(n ^ 2)排序算法快得多。
答案 1 :(得分:1)
实现注意事项:此实现是一个稳定的,自适应的迭代合并输出,当输入数组被部分排序时,需要远远少于n lg(n)的比较,同时在输入数组随机排序时提供传统mergesort的性能。如果输入数组几乎已排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n / 2个对象引用不等。
该实现在其输入数组中具有升序和降序的相同优势,并且可以利用同一输入数组的不同部分中的升序和降序。它非常适合合并两个或多个排序数组:只需连接数组并对结果数组进行排序。
该实现改编自Tim Peters的Python排序(TimSort)。它使用了Peter McIlroy&#34;乐观排序和信息理论复杂性&#34;中的技术,在第四届年度ACM-SIAM离散算法研讨会论文集,第467-474页,1993年1月。
此实现将指定的列表转储到数组中,对数组进行排序,并迭代列表,从数组中的相应位置重置每个元素。这样可以避免尝试对链接列表进行排序所导致的n2 log(n)性能。