【问题标题】:How efficient is the collection.sort() function?collection.sort() 函数的效率如何?
【发布时间】:2014-11-23 04:15:00
【问题描述】:

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() 是这样创建的,考虑到它是多么的低效。

【问题讨论】:

    标签: java performance algorithm sorting


    【解决方案1】:

    来自关于 Collection 方法 sort() 的文档:

    实现说明:此实现是一个稳定的、自适应的、迭代的mergesort,当输入数组部分排序时,它需要远少于 n 次 lg(n) 比较,同时提供传统合并排序的性能,当输入数组是随机排序的。 如果输入数组接近排序,则实现需要大约 n 次比较。临时存储要求从几乎排序的输入数组的小常数到随机排序的输入数组的 n/2 对象引用不等。

    这意味着 O(n log n)最坏情况。所以是的,它非常快(即使在最坏的情况下),比 O(n^2) 排序算法快得多。

    【讨论】:

      【解决方案2】:

      引用the documentation

      实现说明:此实现是一种稳定的、自适应的、迭代的归并排序,当输入数组部分排序时,它需要远少于 n 次 lg(n) 比较,同时在输入数组随机排序时提供传统归并排序的性能.如果输入数组接近排序,则实现需要大约 n 次比较。临时存储要求从几乎排序的输入数组的小常数到随机排序的输入数组的 n/2 对象引用不等。

      该实现在其输入数组中同等地利用升序和降序,并且可以在同一输入数组的不同部分利用升序和降序。它非常适合合并两个或多个排序数组:只需连接数组并对结果数组进行排序。

      该实现改编自 Tim Peters 的 Python 列表排序 (TimSort)。它使用了 Peter McIlroy 在 1993 年 1 月的第四届 ACM-SIAM 离散算法研讨会论文集上的“乐观排序和信息论复杂性”中的技术。

      这个实现将指定的列表转储到一个数组中,对数组进行排序,然后遍历列表,从数组中的相应位置重置每个元素。这避免了由于尝试对链表进行就地排序而导致的 n2 log(n) 性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多