就一般而言,快速排序、归并排序和堆排序似乎在平均情况和最坏情况下表现更好,因此不能做到啥都行。然而,插入排序似乎在增量排序方面表现出色,也就是说,在长时间内将元素逐个添加到列表中,并保持列表排序,特别是如果将插入排序实现为链表 (O(log n) 平均情况下 vs. O(n))。然而,堆看起来也能够执行增量排序,而且执行效果同样不错(从堆中添加或移除单个元素的最坏情况是 O(log n))。那么相比于其他基于比较的排序算法或堆,插入排序究竟有哪些优势呢?
就一般而言,快速排序、归并排序和堆排序似乎在平均情况和最坏情况下表现更好,因此不能做到啥都行。然而,插入排序似乎在增量排序方面表现出色,也就是说,在长时间内将元素逐个添加到列表中,并保持列表排序,特别是如果将插入排序实现为链表 (O(log n) 平均情况下 vs. O(n))。然而,堆看起来也能够执行增量排序,而且执行效果同样不错(从堆中添加或移除单个元素的最坏情况是 O(log n))。那么相比于其他基于比较的排序算法或堆,插入排序究竟有哪些优势呢?
来自http://www.sorting-algorithms.com/insertion-sort:
虽然插入排序是具有$O(n^2)$最坏时间复杂度的基本排序算法之一,但当数据接近排序状态(因为它是自适应的),或者问题规模较小(因为它的开销较低)时,插入排序是首选的算法。
出于这些原因,以及因为它也是稳定的,插入排序通常被用作高开销分治排序算法(例如归并排序或快速排序)的递归基线情形(当问题规模较小时)。
是的,使用插入排序或其变体有其原因。
其他答案中提到的排序替代方案(快速排序等)假设数据已经在内存中并准备就绪。
但是,如果您试图从较慢的外部源(例如硬盘)读取大量数据,则会浪费大量时间,因为瓶颈显然是数据通道或驱动器本身。它无法跟上CPU的速度。任何读取期间都会发生自然的等待序列。除非您在排序过程中利用这些等待来进行排序,否则这些等待将成为浪费的CPU周期。
例如,如果您将解决此问题的方法设置为以下内容:
您很可能需要比使用两个线程执行以下操作更长的时间。
线程A:
线程B:
...以上步骤可以利用其他时间。注意:线程B不会妨碍线程A的进度。
等到数据被完全读取时,它将已经被排序并准备好使用。
大多数排序程序会使用快速排序,对于非常小的数据集,则会使用插入排序。
是的,
在短列表上,插入排序比快速排序更好。
事实上,最佳的快速排序有一个尺寸阈值,在此处停止,然后通过插入排序对超过阈值的整个数组进行排序。
此外...
为了维护记分板,二进制插入排序可能是最好的选择。
请参见此页面。