【发布时间】:2012-04-22 12:45:52
【问题描述】:
我将插入排序与快速排序进行比较。我已经弄清楚为什么 qsort 在几乎已排序的数组上较慢,但我无法弄清楚为什么插入排序要快得多,肯定它仍然需要比较数组中几乎一样多的元素吗?
【问题讨论】:
-
提供有关插入排序的更多信息。数组排序后是否有停止迭代的检查?
我将插入排序与快速排序进行比较。我已经弄清楚为什么 qsort 在几乎已排序的数组上较慢,但我无法弄清楚为什么插入排序要快得多,肯定它仍然需要比较数组中几乎一样多的元素吗?
【问题讨论】:
插入排序在已排序或接近排序的数组上更快的原因是,当它向数组的已排序部分插入元素时,几乎不需要移动任何元素。例如,如果数组的排序部分是1 2,而下一个元素是3,它只需要进行一次比较——2 < 3——来确定它不需要移动3一点也不。因此,对已排序数组的插入排序是线性时间的,因为它只需要对每个元素进行一次比较。
【讨论】:
这取决于几个因素。插入排序将比对小型数据集的快速排序更有效。它还取决于您的后备列表实现(LinkedList 或 ArrayList)。最后,它还取决于输入数据是否有任何排序。例如,如果您的输入数据已经按相反的顺序排序并且您使用 LinkedList,则插入排序将非常快。
【讨论】:
快速排序在已排序的数组上具有最坏的情况(O(n^2) 时间复杂度)(请参阅quicksort entry on Wikipedia)。
根据枢轴元素的选择,这可以在一定程度上得到缓解,但同时,插入排序的最佳情况恰好是预排序的情况(这种输入的时间复杂度为 O(n)) ,因此对于这个特定的用例,它会胜过快速排序。
【讨论】:
插入排序算法在已排序数组上以线性时间运行,因为对于已排序数组,插入排序只需进行一次比较,即针对前一个元素,因此已排序数组上的插入排序必须线性移动,复杂度为 - O(n)。 与复杂度为 O(n2) 的快速排序相比
【讨论】:
已排序的输入是插入排序的最佳情况 (O(n)),而快速排序的最坏情况是 (O(n^2))。
这一切都与复杂性有关,复杂性取决于密钥比较的数量,这是两种算法的基本操作。
因此,当您看到两者的算法时,您会发现在插入排序中您只有 n 次比较,因为当我们插入一个元素时,我们只与左元素进行比较并完成。另一方面,在快速排序的情况下,您必须不断将您的枢轴元素与所有左侧元素进行比较,并且您的数组类型会减少一个常数,导致大约 n^2 比较。
【讨论】: