我正在尝试在数组或数组列表中对10万个帐户对象进行排序。 Account类实现了类似的接口。我需要按年龄对这个数组或数组列表进行排序,并且我需要保持相同年龄的帐户的相对排序。
我想我会在这个应用程序中使用Mergesort,因为1)Mergesort是一个稳定的可比类型,它将保持相对排序,并且它具有n log n的最佳最坏情况时间。然而,二元树排序具有类似的效果,具有相同数量的对象的时间复杂度。你觉得怎么样?
答案 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 sorting和external sorting之间的区别。你的方法 需要外部排序机制。
例如,如果他们想要计算员工的年龄,那么 可能使用Counting sort,它可以排序 记忆中的数据。
但对于相当随机的数据,您需要external sorting。