排序列表,哪种算法适合使用?

时间:2018-02-20 10:14:15

标签: algorithm sorting arraylist linked-list

我已经明白,当排序说一个LinkedList时,最好使用合并排序,因为当你想把一些东西放在列表的中间时,你可以在O(1)中做到(常数)时间和O(1)记忆。因此,可以在不占用额外空间的情况下完成合并排序。

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

如果我对LinkedList有误,请纠正我,或者让我知道我是否遗漏了某些内容(例如,使用合并的一些论点)。

2 个答案:

答案 0 :(得分:0)

如果没有将列表复制到数组,排序数组,然后创建新列表,最快的列表排序是自下而上的合并排序:

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

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

答案 1 :(得分:0)

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

  

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

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