排序算法在排序一千万个对象时是稳定的

时间:2015-06-11 05:38:44

标签: java sorting mergesort comparable

我正在尝试在数组或数组列表中对10万个帐户对象进行排序。 Account类实现了类似的接口。我需要按年龄对这个数组或数组列表进行排序,并且我需要保持相同年龄的帐户的相对排序。

我想我会在这个应用程序中使用Mergesort,因为1)Mergesort是一个稳定的可比类型,它将保持相对排序,并且它具有n log n的最佳最坏情况时间。然而,二元树排序具有类似的效果,具有相同数量的对象的时间复杂度。你觉得怎么样?

5 个答案:

答案 0 :(得分:2)

如果你真的想按年龄排序,那么使用Counting Sort(http://en.wikipedia.org/wiki/Counting_sort)怎么样?您可以在最多2次迭代或2n次查找中保持与原始相同的相对顺序。

答案 1 :(得分:2)

来自Collections.sort()的javadoc:

  

此类保证稳定:由于排序,相同的元素不会被重新排序。

所以不要重新发明轮子,只需使用JDK提供的标准排序算法:Collections.sort(),或者更好,如果使用Java 8:List.sort()。如果没有任何允许JIT优化代码的预热,那么在我的机器上对年龄介于0到30之间的10M帐户进行排序需要1.4秒。

答案 2 :(得分:1)

我更喜欢使用合并排序,因为它不会增加空间复杂性。

Quickost也将被视为提供空间和内存分配不是约束

答案 3 :(得分:1)

我认为你可以通过连续步骤来实现:

步骤1:将10万个对象分成2 ^ N个切片,并对每个切片进行排序;

步骤2:对2个切片中的头部对象使用electort并合并到新切片中;

第3步:一次又一次地执行第2步,仅使用1个切片。

答案 4 :(得分:0)

  

这取决于最佳解决方案的参数   问题需要,排序后你的主要操作是什么,是32   位或64位数字。你的项目要求是什么。

     

查看internal sortingexternal sorting之间的区别。你的方法   需要外部排序机制。

     

例如,如果他们想要计算员工的年龄,那么   可能使用Counting sort,它可以排序   记忆中的数据。

     

但对于相当随机的数据,您需要external sorting