选择排序算法的标准是什么?

时间:2012-03-21 03:05:20

标签: c++ data-structures

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

试图找出排序以便更好地理解。

对堆排序有一些疑问:

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

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

  3. 堆排序的缺点是什么?

  4. 什么是堆的构建时间? (我听说O(n),但我不确定。)

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

  6. 在对数据应用堆排序之前,我们会查看数据的参数是什么?

2 个答案:

答案 0 :(得分:12)

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

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

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

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

当然,算法设计通常需要在时间和空间之间进行权衡 - 具有低空间复杂度的算法可能需要更多时间,而时间复杂度低的算法可能需要更多空间。

有关详情,您可能会发现this tutorial有用。


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

答案 1 :(得分:0)

如果您指的是选择何种类型的排序标准,则可以考虑以下其他一些项目。

您拥有的数据量:您要分类十个,一百个,一千个或数百万个项目。

算法的复杂性:越复杂,需要做更多的测试才能确保它是正确的。对于少量,冒泡排序或快速排序很容易编码和测试,其他类型可能对您必须排序的数据量过大。

排序需要多长时间:如果你有一大套,泡泡/快速排序会花费很多时间,但如果你有很多时间,那可能不是问题。但是,使用更复杂的算法会缩短排序时间,但代价是编码和测试需要付出更多努力,如果排序从长(小时/天)到较短的时间,这可能是值得的。

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

可用资源量:您是否有大量存储所有项目的内存,或者是否需要将项目存储到磁盘。如果一切都不能适合内存,合并排序可能是最好的,如果你使用内存中的所有内容,其他可能会更好。