为啥插入排序比快速排序和冒泡排序更快?

Posted

技术标签:

【中文标题】为啥插入排序比快速排序和冒泡排序更快?【英文标题】:Why is insertion sort faster than quick-sort and bubble-sort for small cases?为什么插入排序比快速排序和冒泡排序更快? 【发布时间】:2011-11-30 09:33:51 【问题描述】:

我最近读到一篇文章,谈到了算法的计算复杂性。 作者提到了“为什么插入排序比小情况下的快速排序和冒泡排序更快”。有人能解释一下吗?

有人知道我上面提到的每种排序算法的实际复杂性吗?

【问题讨论】:

它是说“小案例”还是“几乎排序的案例”或“几乎没有区别”之类的东西?对于小情况,修改后的冒泡排序比插入排序快 @FooBah,我说的是小箱子,意思是小尺寸的箱子。 那你读错了。对于小情况,冒泡排序比插入排序更快 @FooBah,您对您的结论有进一步的数学支持吗?我的意思是任何数学表达式或公式,请... 【参考方案1】:

考虑两个复杂函数:

F(X) = X^2 G(X) = 4 * X * ln(X)

F(3) = 9 G(3) = 13

所以算法 F 赢得了 3 个项目。但是:

F(100) = 10,000 G(100) = 1,842

所以算法 G 赢得 100 个项目。

插入排序的复杂度类似于 F(X)。快速排序的复杂度就像 G(X)。

【讨论】:

naïve QuickSort 的最坏情况复杂度是 O(N^2);正常的复杂度是 O(N log N)。插入排序和冒泡排序的复杂度都是O(N^2)。 没有解释插入排序如何击败冒泡排序。 @Foo Bah:根据 Sedgewick 的说法,冒泡排序平均使用 N^2 / 2 次比较和 N^2 / 2 次交换。插入排序使用 N^2 / 4 次比较和 N^2 / 8 次交换。两者都是 O(N^2),但其他因素使插入排序更快。 @rossum 我不反对对大 N 的分析。但是对于小 N,开销和其他影响实际上支持冒泡排序。【参考方案2】:

如果一个列表已经排序,快速排序需要经过所有递归步骤才能得到 n 个大小为 1 的列表。这两个都需要时间。但是插入排序将遍历列表一次并发现它已完成。这是这种情况下最快的。

当列表很小时,进行递归调用和查找枢轴值等的开销比插入排序中使用的迭代过程要慢得多。

【讨论】:

冒泡排序使排序列表通过 1 次。列表排序后停止排序。 Foo Bah,好电话。我在考虑错误的排序并对其进行了编辑【参考方案3】:

每个排序算法的实际复杂度如下:

    最佳 - 插入排序:O(N ^ 2), O(N), O(N ^ 2) 平均 - 快速 Qort:O(N ^ 2), O(N log N), O(N log N) 最差 - 冒泡排序:O(N ^ 2), O(N), O(N ^ 2)

【讨论】:

你知道每个平均情况的实际数学表达式吗? 对于快速排序,它是 T(n) = O(n) + 2T(n/2) 对于其余的,如果你有 Cormen 的书,这里对这些算法进行了彻底的分析。 @SITZ 世界其他地方称之为 CLR 或 CLRS

以上是关于为啥插入排序比快速排序和冒泡排序更快?的主要内容,如果未能解决你的问题,请参考以下文章

第四篇快速冒泡选择插入排序

Go语言实现冒泡排序选择排序快速排序及插入排序的方法

为啥输入较小时插入排序比快速排序快?

所有排序算法汇总,冒泡,选择,插入,快速,优化快速,归并,希尔,堆排序

排序算法(冒泡排序选择排序插入排序快速排序归并排序)

排序算法(冒泡排序选择排序插入排序快速排序归并排序)