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

Posted

技术标签:

【中文标题】为啥输入较小时插入排序比快速排序快?【英文标题】:Why is Insertion Sort faster than Quick Sort when the input size is small?为什么输入较小时插入排序比快速排序快? 【发布时间】:2013-10-27 11:58:10 【问题描述】:

我想得到理论原因而不是实验结果。 另外,我们如何确定数据大小何时称为小或大?

我没有解释清楚,我的意思是当输入的数据量很小的时候,我们通常选择使用插入排序或者不使用快速排序,没错。所以我想知道这是为什么?

【问题讨论】:

***.com/questions/736920/… 什么更好?另外:(因为你想要一个理论上的答案)请先定义 better . 哦!对不起,我的意思是快 插入排序变得比某些 O(n log n) 排序更快的确切点可能主要基于实验结果,而不是理论。 【参考方案1】:

请记住,在渐近分析中,我们会忽略常数因子。所以 Quicksort 的 O(n log n) 复杂度实际上是 O(C(n log n)),其中 C 是某个未知常数。同样,插入排序的 O(n^2) 实际上是 O(C(n^2))。我们将这些常数称为 Cq 和 Ci。

所以当 (Ci * n^2)

看一下 Ci

快速排序稍微复杂一点,每次迭代需要更多步骤,但迭代次数更少。

考虑对一个五元素数组进行排序。最坏的情况是插入排序:

外环控制变量的5个增量和比较 内环控制变量的15个增量和比较 15 个元素比较 15 次交换

现在看看Quicksort,在平均的情况下,它必须划分四个子数组。 5 个元素的数组被分成 3 个和 2 个元素的两个子数组。 3 元素子阵列进一步划分为 1 和 2 元素的子阵列。然后对两个二元子数组进行分区。

所以partition 方法将被调用四次。除了元素的比较和交换以及其他开销之外,每个分区步骤至少需要两次交换。当您将所有内容加起来时,您会发现 Quicksort 每次迭代都做了更多的工作。当迭代次数较少时,插入排序虽然迭代次数较多,但总工作量较少。

您可以进行逐步分析以确定“小”的理论值,其中插入排序将比快速排序更快。通常这是通过计算“基本操作”来完成的,尽管定义有些灵活。在这种情况下,这很简单:比较、赋值或函数调用是“基本操作”。

理论结果与实验得出的结果如何匹配将取决于特定的计算机硬件以及比较的成本。如果比较非常昂贵,那么您将需要选择执行最少比较次数的算法。但如果比较成本相对较低(例如,比较数字,甚至是字符串,只要它们没有长的公共前缀),那么算法开销就是限制因素,简单低效算法优于复杂高效算法。

【讨论】:

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

排序算法

java编程的冒泡等排序示例

排序算法

拓扑排序(图)、冒泡排序、插入排序

[Java数据结构与算法]简单排序之插入排序

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