为什么QuickSort在排序几乎排序的数据时不好?相比之下,为什么插入排序更好?试图了解Big O符号!
答案 0 :(得分:4)
您的陈述适用于某些QS变体,具体取决于支点的选择。 QS性能取决于将数据分成大小大致相等的块的数据透视操作,然后将这些数据分别进行分类。如果枢轴是数据的最小值或最大值,或代表较高或较低的百分位数,则枢轴操作会将数据分为两部分,从而大多数数据位于这两者之一中,仍然需要排序。如果将数据的第一个元素选择为枢轴,并对数据进行排序,则会发生这种最坏情况。通过仅选择一个随机元素作为枢轴,最坏的情况发生的可能性就很小。这与最坏情况的分析无关,但是平均而言(在可能的支点上,最坏情况的wrt输入)或在实践中会产生良好的性能。
答案 1 :(得分:2)
Quicksort的算法如下:
关于排序/近排序列表执行不佳的断言是否成立完全取决于步骤1的执行方式。枢纽是什么?假设我正在尝试将以下列表按升序排序:
1, 2, 3, 4, 5, 6
好吧,让我们考虑一下步骤1。我将哪个用作枢轴?如果我们在假定列表顺序是随机的情况下设计代码,则可能只使用第一个元素,因为当顺序完全随机时,任何枢轴都可能是好的。但是,在这种情况下,需要排序的两个子列表极为不平衡。具体来说,第一个为空,第二个为所有剩余值
2, 3, 4, 5, 6
对它进行排序时,我们将使用2
作为枢轴,并发现完全相同的事情再次发生。最终,这意味着将每个值彼此比较。但是,如果我们选择3作为枢轴,则将剩下的值分成1, 2
和4, 5, 6
。结果,1
将与2
进行比较,但都不需要与4, 5, 6
中的任何值进行比较。让我们考虑如何4, 5, 6
进行排序。如果选择4
作为枢轴,则将4
与5
和6
进行比较,然后将5
与{{1}在下一个迭代中。相反,如果将6
作为我们的支点,则将5
与5
和4
进行比较,但是将6
和4
永远都不会进行比较-其他。
请注意,对于列表以完全相反的顺序排列的情况,此问题也相同。
当然,解决方案可能是使用另一种技术来选择枢轴。
就大O表示法而言,插入排序具有O(n ^ 2),而快速排序具有最坏情况的O(n ^ 2),但具有最佳情况的O(nlog(n))。插入排序几乎从来没有比Quicksort更好。
附录:Insert-sort适用于预排序列表,因为它通过迭代比较元素与其相邻元素以查看是否应该彼此交换来起作用。在预先排序的列表中,不会进行交换,因此每个元素不需要进行超过1个比较,因此可以视为O(n)。