选择排序算法的标准

时间:2012-10-12 14:17:21

标签: algorithm c++-concepts

我很想知道如何根据输入选择排序算法,这样我才能获得最佳效率。

它应该是输入的大小还是输入的排列方式(Asc / Desc)或使用的数据结构等......?

4 个答案:

答案 0 :(得分:4)

一般算法的重要性,以及排序算法的重要性如下:

(*)正确性 - 这是最重要的事情。如果你的算法超快速有效,那就没什么了不起的,但是错了。在排序中,即使你有两个候选人正确排序,但你需要一个stable sort - 你会选择稳定的排序算法,即使效率较低 - 因为它对你的目的是正确的,而另一个不是。

接下来基本上是在运行时间,所需空间和实施时间之间的权衡(如果你需要从头开始实现某些东西,而不是使用库,以获得轻微的性能提升 - 它可能不会'值得的)

在考虑上述权衡时需要考虑的一些事项:

  1. 输入的大小(例如:对于小输入,插入排序在经验上比更高级的算法更快,但需要O(n^2))。
  2. 输入的位置(磁盘上的排序算法与RAM上的算法不同,因为磁盘读取在不顺序时效率要低得多。通常用于在磁盘上排序的算法是一种变体合并排序)。
  3. 如何分发数据?如果数据可能“几乎排序” - 也许通常可怕的冒泡排序可以在2-3次迭代中对其进行排序,并且与其他算法相比速度超快。
  4. 您已经实施了哪些?实施新的东西需要多少工作?它值得吗?
  5. 输入的类型(和范围) - 对于可枚举数据(例如整数) - 整数设计算法(如基数排序)可能比一般情况算法更有效。
  6. 延迟要求 - 如果您正在设计导弹头,并且结果必须在特定时间内返回,快速排序可能会在最坏情况下衰减到二次运行时间 - 可能不是一个好选择,您可能希望使用另一种具有严格O(nlogn)最坏情况的算法。
  7. 您的硬件 - 例如,如果您使用的是庞大的群集和庞大的数据 - 分布式排序算法可能会比尝试在一台计算机上完成所有工作更好。

答案 1 :(得分:3)

它应该基于所有这些事情。

  • 您需要考虑数据的大小,因为对于小型数据集,插入排序可能比快速排序等更快

  • 您需要知道数据的排列方式,因为每种算法的最差/平均/最佳情况渐近运行时间不同(有些最差/平均情况相同而另一些可能有最差的情况) case vs avg)

  • 您显然需要知道所使用的数据结构,因为如果您的数据已经采用特殊格式,或者您可以有效地将其放入新的数据结构中,那么会有一些非常专业的排序算法你为你排序(一个BST或堆)

答案 2 :(得分:0)

决定您选择排序算法的两个主要因素是时间复杂度空间复杂度。根据您的场景以及您可用的资源(时间和内存),您可能需要根据每种排序算法提供的内容在排序算法之间进行选择。

排序算法的实际性能也取决于输入数据,如果我们事先知道输入数据的某些特征,例如输入的大小,数组已经排序的方式,它会有所帮助。

例如, 如果您事先知道输入数据只有1000个非负整数,那么您可以使用counting sort在线性时间内对这样的数组进行排序。

排序算法的选择取决于空间和时间的约束,以及输入数据的大小/特征。

答案 3 :(得分:0)

在非常高的水平上,您需要考虑插入比率与每种算法的比较。

对于文件中的整数,这不是非常重要,但如果你说你是根据内容对文件进行排序,你自然希望尽可能少地进行比较。