为什么插入排序比排序数组上的快速排序更快

时间:2012-04-22 12:45:53

标签: java sorting

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Quicksort在已经排序的数组上有最坏的情况(O(n ^ 2)时间复杂度)(参见quicksort entry on Wikipedia)。

根据pivot元素的选择,这可以稍微减轻,但同时,插入排序的最佳情况恰好是预先排序的情况(对于这样的输入,它具有O(n)时间复杂度) ,因此它会为这个特殊用例击败快速排序。

答案 3 :(得分:0)

Insertion Sort算法在一个排序后的数组上线性运行,因为对于一个排序后的数组,Insertion sort只能执行一个比较,即对前一个元素进行比较,因此,对sorted数组上的插入排序必须线性移动,将复杂度定为-O(n)。 与复杂度为O(n2)的快速排序相比

答案 4 :(得分:-1)

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

这一切都与复杂性有关,复杂性由关键比较的数量决定,这是两种算法的基本操作。

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