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

Are Selection or Insertion sort useful outside of academic environments?

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

或者它只是一个复杂度为n^2的排序算法的基本例子?

谁能举例说明它的用法?

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

实际上,当要排序的子数组低于特定阈值时,许多快速排序/合并排序实现会停止,然后对这些小数组使用插入排序。


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

对于小的输入大小,插入排序实际上非常快,因为它的复杂性中隐藏的常数很小。达到一定规模,插入排序比归并排序快。

因此,很多流行的排序算法,当数组变得很小的时候,就会采用插入排序。

底线: 对于足够小的情况,O(N2) 算法在实践中可能比 O(N*logN) 算法更快由于隐藏的常数,输入的大小。

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

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

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

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

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

附带说明一下,据我所知,任何公共库都没有使用自上而下的合并排序。相反,内部(内存)和外部(磁盘)合并排序的通用库版本都是自下而上合并排序(如 timsort)的变体。然而,在课堂环境或网站文章中,自上而下归并排序的示例多于自下而上归并排序的示例。