【问题标题】:Sorting lists, which algorithm is appropriate to use?排序列表,哪种算法适合使用?
【发布时间】:2018-02-20 10:14:15
【问题描述】:

我开始明白,在对 LinkedList 进行排序时,最好使用归并排序,因为当您想将某些内容放在列表中间时,您需要在 O(1)(恒定)时间和 O( 1)记忆。因此可以在不占用额外空间的情况下完成归并排序。

我的问题是:应该在 ArrayList 上使用哪种排序算法?您对哪种数据类型进行排序重要吗?

如果我对 LinkedList 有错误,请纠正我,或者如果我遗漏了什么(例如使用合并的一些论据),请告诉我。

【问题讨论】:

    标签: algorithm sorting arraylist linked-list


    【解决方案1】:

    将列表复制到数组中,对数组进行排序,然后创建一个新列表,最快的列表排序是自底向上合并排序:

    https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists

    假设 ArrayList 被实现为一个指向对象的指针数组,并且对 ArrayList 进行排序是对指针进行排序而不是对对象进行排序,那么归并排序比快速排序更快,因为归并排序比快速排序移动更多,但比较次数更少排序,在这种情况下,只有指针被移动,而比较涉及通过指针间接进行。

    【讨论】:

      【解决方案2】:

      正如我所发现的,您正在寻找就地排序算法(要了解更多信息,请参阅here):

      在计算复杂度理论中,就地算法的严格定义包括所有具有 O(1) 空间复杂度的算法,DSPACE(1) 类。

      此外,您可以查看就地排序算法列表here。 堆排序和平滑排序就是这些算法中的一种。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-14
        • 2018-12-24
        • 2010-10-27
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2010-10-25
        • 2011-11-02
        相关资源
        最近更新 更多