我应该在这种情况下使用哪种排序算法?

时间:2011-06-22 11:27:34

标签: java algorithm sorting

研究人员拥有1亿人的记录数据库。研究人员希望根据其他标准(如星座,出生年份等)研究给定名称的分布,因此希望按名称排序,以后再进行进一步排序。

我应该使用哪种?

一个。选择
B.快速
C.堆
D.插入
E.合并

谢谢!

5 个答案:

答案 0 :(得分:6)

自从你亲自到达以来,这不是我的答案,但这里是为了更好的可见性:

  1. 可以排除选择和插入,因为它们的平均运行时间为O(n^2),而不会削减100M项目。
  2. 排除了Heapsort和quicksort,因为它们不稳定。此问题需要稳定排序,因为问题定义意味着在进一步排序时,需要维护原始顺序(按名称)。
  3. 这只会让mergesort成为合适的人选。
  4. 更新:与考试相关的建议

    我必须承认上面的第2点(按名称保留排序)不是完全清除问题描述。但是,这是一个考试问题,必须有一些方法将选项缩减为一个。只有通过要求稳定的分类才能实现这一点,所以即使措辞不是铁定的,也要求有这样的要求。

    这种实践思维方式使得IMHO更容易为某些类型的考试问题找到明确的答案。

答案 1 :(得分:3)

尝试将您的需求映射到http://en.wikipedia.org/wiki/Sort_algorithms#Comparison_of_algorithms的比较表。

答案 2 :(得分:0)

如果你想获得直方图,我不会对数据进行排序。我会仔细检查计算所有感兴趣组合的所有数据。这是O(N)操作。

首先对数据进行排序不太可能提高速度。这是O(N * log(N))操作。


如果想要对所有记录进行排序,我会将Collection.sort()与自定义比较器一起使用,该比较器包含您需要比较的所有字段。您必须将所有记录加载到内存中,这将占用几GB,但是一旦完成此操作,它应该非常快。

提高速度的唯一方法是过滤标准。如果你这样做,我会创建一个集合,其中包含感兴趣的记录副本并对其进行排序。

答案 3 :(得分:0)

最有效的排序算法,不是传统的算法。

由于你是根据出生年份和星座这样的标准进行排序,我会做一个“堆栈排序”(我刚刚做了)。

它会以这种方式工作。

为每个可能的排序值创建数据结构。让我们以出生年份为例。在出生年份,它可能只有大约100个不同的值。

  1. 为Birth year(100指针数组,每年一个)的每个可能值声明一个数据结构
  2. 遍历每条记录,并将指针放在该数组中的记录中。
  3. 当你完成每个记录的循环时,你现在有100个数组,每个数组都填充了具有特定出生年份的记录。关于这个的重要部分是你在O(n)时间内完成它,所以它比任何其他排序算法快得多。这也适用于十二生肖等...

    在盒子外面思考。当使用可能的值(m)对大数据集(n)进行排序时,该方法非常有用,其中m <&lt;&lt; Ñ

答案 4 :(得分:0)

有人发了一个副本,这将是我的答案。自从我努力输入所有这些内容后,我不妨将其分享给未来的读者。

每种排序算法都有其最佳和最差的用例。这就是我尝试思考它的方式:

  • 选择排序:我很少/从不使用选择排序,因为几乎总是插入排序执行它。这最适用于小型数据集和近乎排序的列表
  • 快速排序:寻找最佳平均案例Senario
  • 堆排序:最差可能的最坏情况
  • 插入排序:(参见选择)
  • 合并排序:合并排序比快速排序略慢,但保证了O(n log n)行为。这里的关键点是合并排序比快速排序稳定得多。

显然,这是一个非常简洁的概述。您可以在维基百科上找到更多信息,也可以通过Google搜索找到:“何时使用[在此处插入算法]”

希望有所帮助!