【问题标题】:What are the criteria for choosing a sorting algorithm?选择排序算法的标准是什么?
【发布时间】:2012-03-21 03:05:19
【问题描述】:

我正在阅读排序方法,包括冒泡排序、选择排序、归并排序、堆排序、桶排序等。它们还包含时间复杂度,可以帮助我们了解哪种排序是有效的。所以我有一个基本的问题。如果我们包含数据,我们将如何选择排序。时间复杂度是帮助我们决定排序方法的参数之一。但是我们是否有另一个参数来选择排序方法?

只是想弄清楚排序以便更好地理解。

对堆排序有一些疑问:

  1. 我们在哪里使用堆排序?

  2. 堆排序的更大优势是什么(除了时间复杂度 O(n log n))?

  3. 堆排序有什么缺点?

  4. 堆的构建时间是多少? (我听说过 O(n) 但我不确定。)

  5. 我们必须使用堆排序或堆排序的任何场景都是更好的选择(优先级队列除外)?

  6. 在对数据应用堆排序之前,我们将查看哪些参数?

【问题讨论】:

  • “如果我们包含数据”是什么意思?您是在问如何为特定数据集选择排序方法?
  • 您尚未接受您之前问题的任何答案。这会让很多人无法帮助你。
  • 您的问题是否更好地表达为选择排序算法的标准是什么?如果是,请编辑Q标题。
  • 您更新的问题看起来很像家庭作业,所以我给了您一个链接,可能对我的回答有所帮助。如果是作业,可以加homework标签吗?如果没有,您可能想稍微缩小您的问题范围。

标签: c++ data-structures


【解决方案1】:

排序算法的两个主要理论特征是时间复杂度和空间复杂度。

一般来说,time complexity 让我们知道算法的性能如何随着数据集大小的增加而变化。需要考虑的事项:

  • 您希望对多少数据进行排序?这将帮助您了解是否需要寻找时间复杂度非常低的算法。
  • 您的数据已经排序到什么程度了? 会部分排序吗?随机排序?这会影响排序算法的时间复杂度。大多数算法都有最坏和最好的情况 - 您要确保您没有在最坏情况的数据集上使用算法。
  • 时间复杂度与运行时间不同。请记住,时间复杂度仅描述算法的性能如何随着数据集大小的增加而变化。总是对所有输入进行一次传递的算法将是 O(n) - 它的性能与输入的大小线性相关。但是,总是对数据集进行两次遍历的算法也是 O(n) - 即使常数(和实际运行时间)不同,相关性仍然是线性的。

同样,空间复杂度描述了算法需要运行多少空间。例如,insertion sort 之类的简单排序需要额外的固定空间来存储当前插入的元素的值。这是 O(1) 的辅助空间复杂度——它不会随着输入的大小而改变。但是,merge sort 在运行时会在内存中创建额外的数组,辅助空间复杂度为 O(n)。这意味着它需要的额外空间量与输入的大小呈线性相关。

当然,算法设计往往是时间和空间之间的权衡——空间复杂度低的算法可能需要更多的时间,时间复杂度低的算法可能需要更多的空间。

如需更多信息,您可能会发现this tutorial 很有用。


要回答您更新的问题,您可能会发现Heap Sort 上的维基百科页面很有用。

【讨论】:

    【解决方案2】:

    如果您的意思是选择哪种类型的标准,这里还有一些其他需要考虑的项目。

    您拥有的数据量:您有十个、一百个、一千个或数百万个要排序的项目。

    算法的复杂性:越复杂,需要进行越多的测试以确保其正确性。对于少量数据,冒泡排序或快速排序很容易编码和测试,而其他排序可能对您必须排序的数据量来说太过分了。

    排序需要多少时间:如果您有一个大集合,冒泡/快速排序将需要很多时间,但如果您有很多时间,这可能不是问题。然而,使用更复杂的算法将减少排序时间,但代价是编码和测试方面的更多努力,如果排序时间从长(几小时/天)缩短到更短的时间,这可能是值得的。

    数据本身:数据是否接近于所有事物的相同。对于某些类型,您最终可能会得到一个线性列表,因此,如果您对数据的组成有所了解,它可能有助于确定为该工作选择哪种算法。

    可用资源的数量:您是否有大量内存用于存储所有项目,或者您是否需要将项目存储到磁盘。如果所有内容都无法放入内存,则合并排序可能是最好的,如果您使用内存中的所有内容,其他可能会更好。

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 2020-08-21
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多