我正在阅读排序方法,包括冒泡排序,选择排序,合并排序,堆排序,桶排序等。它们还包含时间复杂度,这有助于我们了解哪种排序是有效的。所以我有一个基本问题。如果我们包含数据,那么我们将如何选择排序。时间复杂度是帮助我们决定排序方法的参数之一。但是我们还有另一个参数来选择排序方法吗?
试图找出排序以便更好地理解。
对堆排序有一些疑问:
我们在哪里使用堆排序?
堆排序的更大优势是什么(时间复杂度O(n log n)除外)?
堆排序的缺点是什么?
什么是堆的构建时间? (我听说O(n),但我不确定。)
我们必须使用堆排序或堆排序的任何情况都是更好的选择(优先队列除外)?
在对数据应用堆排序之前,我们会查看数据的参数是什么?
答案 0 :(得分:12)
排序算法的两个主要理论特征是时间复杂度和空间复杂度。
通常,time complexity让我们知道算法的性能随着数据集大小的增加而变化。需要考虑的事项:
类似地,空间复杂性描述了算法需要运行多少空间。例如,诸如insertion sort的简单排序需要额外的固定空间量来存储当前插入的元素的值。这是O(1)的辅助空间复杂度 - 它不随输入的大小而变化。但是,merge sort在运行时会在内存中创建额外的数组,辅助空间复杂度为O(n)。这意味着它所需的额外空间量与输入的大小呈线性相关。
当然,算法设计通常需要在时间和空间之间进行权衡 - 具有低空间复杂度的算法可能需要更多时间,而时间复杂度低的算法可能需要更多空间。
有关详情,您可能会发现this tutorial有用。
要回答您更新的问题,您可能会发现Heap Sort上的维基百科页面很有用。
答案 1 :(得分:0)
如果您指的是选择何种类型的排序标准,则可以考虑以下其他一些项目。
您拥有的数据量:您要分类十个,一百个,一千个或数百万个项目。
算法的复杂性:越复杂,需要做更多的测试才能确保它是正确的。对于少量,冒泡排序或快速排序很容易编码和测试,其他类型可能对您必须排序的数据量过大。
排序需要多长时间:如果你有一大套,泡泡/快速排序会花费很多时间,但如果你有很多时间,那可能不是问题。但是,使用更复杂的算法会缩短排序时间,但代价是编码和测试需要付出更多努力,如果排序从长(小时/天)到较短的时间,这可能是值得的。
数据本身:数据是否接近于一切。对于某些类型,您最终可能会得到一个线性列表,因此,如果您对数据的组成有所了解,则可能有助于确定选择哪种算法。
可用资源量:您是否有大量存储所有项目的内存,或者是否需要将项目存储到磁盘。如果一切都不能适合内存,合并排序可能是最好的,如果你使用内存中的所有内容,其他可能会更好。