选择或插入排序在学术环境之外是否有用?

时间:2016-02-05 07:15:03

标签: algorithm sorting insertion-sort selection-sort

这些排序算法在实际应用中有用吗?

或者它只是具有n ^ 2复杂度的排序算法的基本示例?

有人可以举一些使用它的例子吗?

4 个答案:

答案 0 :(得分:3)

插入排序是排序非常小的数组的最快排序算法之一。

实际上,当要排序的子数组低于某个阈值时,许多quicksort / mergesort实现会停止,然后插入排序将用于这些小数组。

实践中很少使用选择排序。

答案 1 :(得分:1)

对于小输入大小,插入排序实际上非常快,因为其复杂性中隐藏的常量很小。在某种程度上,插入排序比合并排序更快。

因此,对于许多流行的排序算法,当数组大小变得非常小时,采用插入排序。

底线: AO(N 2 )算法在实践中可能比O(N * logN)算法更快,因为隐藏的常数足够小的输入

答案 2 :(得分:1)

是的,插入排序广泛用于工业应用。这主要是因为几个流行的C ++标准库(例如libstdc++libc++实现了sort例程作为插入排序和深度限制快速排序的组合。

这个想法是插入排序在几乎排序的数组上运行得非常快,而对于快速排序排序输入的直接实现会导致最坏情况的行为。因此,组合算法首先应用类似快速排序的算法对输入进行部分排序,然后通过调用插入排序结束。

libc++插入排序中,如果输入大小足够小(但大于五个元素,因为大小< = 5作为特殊情况处理),默认情况下也会用于排序。

答案 3 :(得分:0)

HP / Microsoft std :: sort()是introsort,带有深度参数的快速排序,如果深度变得太深,则会切换到heapsort。

HP / Microsoft std :: stable_sort()是一种timsort。它使用插入排序来创建32个已排序元素的组,然后使用自下而上合并排序来合并组。

在旁注中,自上而下的合并排序不会在我所知道的任何公共库中使用。相反,内部(内存)和外部(磁盘)合并排序的公共库版本都是自下而上合并排序的变体(如timsort)。然而,在教室环境或网站文章中,您会看到自上而下合并排序的更多示例,而不是自下而上合并排序。