【问题标题】:Why is insertion sort faster than quick sort on a sorted array为什么插入排序比排序数组上的快速排序快
【发布时间】:2012-04-22 12:45:52
【问题描述】:

我将插入排序与快速排序进行比较。我已经弄清楚为什么 qsort 在几乎已排序的数组上较慢,但我无法弄清楚为什么插入排序要快得多,肯定它仍然需要比较数组中几乎一样多的元素吗?

【问题讨论】:

  • 提供有关插入排序的更多信息。数组排序后是否有停止迭代的检查?

标签: java sorting


【解决方案1】:

插入排序在已排序或接近排序的数组上更快的原因是,当它向数组的已排序部分插入元素时,几乎不需要移动任何元素。例如,如果数组的排序部分是1 2,而下一个元素是3,它只需要进行一次比较——2 < 3——来确定它不需要移动3一点也不。因此,对已排序数组的插入排序是线性时间的,因为它只需要对每个元素进行一次比较。

【讨论】:

    【解决方案2】:

    这取决于几个因素。插入排序将比对小型数据集的快速排序更有效。它还取决于您的后备列表实现(LinkedList 或 ArrayList)。最后,它还取决于输入数据是否有任何排序。例如,如果您的输入数据已经按相反的顺序排序并且您使用 LinkedList,则插入排序将非常快。

    【讨论】:

      【解决方案3】:

      快速排序在已排序的数组上具有最坏的情况(O(n^2) 时间复杂度)(请参阅quicksort entry on Wikipedia)。

      根据枢轴元素的选择,这可以在一定程度上得到缓解,但同时,插入排序的最佳情况恰好是预排序的情况(这种输入的时间复杂度为 O(n)) ,因此对于这个特定的用例,它会胜过快速排序。

      【讨论】:

        【解决方案4】:

        插入排序算法在已排序数组上以线性时间运行,因为对于已排序数组,插入排序只需进行一次比较,即针对前一个元素,因此已排序数组上的插入排序必须线性移动,复杂度为 - O(n)。 与复杂度为 O(n2) 的快速排序相比

        【讨论】:

          【解决方案5】:

          已排序的输入是插入排序的最佳情况 (O(n)),而快速排序的最坏情况是 (O(n^2))。

          这一切都与复杂性有关,复杂性取决于密钥比较的数量,这是两种算法的基本操作。

          因此,当您看到两者的算法时,您会发现在插入排序中您只有 n 次比较,因为当我们插入一个元素时,我们只与左元素进行比较并完成。另一方面,在快速排序的情况下,您必须不断将您的枢轴元素与所有左侧元素进行比较,并且您的数组类型会减少一个常数,导致大约 n^2 比较。

          【讨论】:

            猜你喜欢
            • 2011-11-30
            • 1970-01-01
            • 2018-03-28
            • 2016-02-01
            • 2016-12-23
            • 2017-03-18
            • 1970-01-01
            • 1970-01-01
            • 2023-04-06
            相关资源
            最近更新 更多