我对快速排序的平均和最差情况有点困惑。我知道以下内容:
以上三点是否属实?如果不是,我想知道快速排序对于几乎排序的列表和未排序列表的行为如何?
答案 0 :(得分:3)
你对(1)和(2)是正确的。当数据分割大约一半(理想情况下枢轴是中位数)时,Quicksort表现良好,当分割不均匀时,Quicksort表现不佳。
输入数据是否排序的重要性取决于枢轴的选择方式。
最简单的枢轴选择是获取您正在分区的部分的第一个元素。如果你这样做,并且如果数据被排序或反向排序,那么你得到最不均衡的可能除法,因为你选择的数据透视表是范围中最小或最大的值。
我认为,下一个最简单的方法是将元素作为输入中途的元素。然后,如果数据已经排序,则可以获得最佳分割。欢呼!但是这个中间元素仍然可能是该范围中最小(或最大)的值,在这种情况下,您会得到一个坏分区。 BOO!
可以使用各种技术更好地选择枢轴:“三个中位数”,“伪中位数九”或随机(在这种情况下恶意用户无法构建最坏情况)发送给你,并且对于大尺寸输入而言,坏情况的可能性非常小,实际上你无法合理地关注)。
你甚至可以使用中位数中值快速选择来找到线性时间的中位数并将其用作一个支点,从而完全避免O(n ^ 2)最坏的情况。实际上,有一种更好的方法可以避免出现O(n ^ 2)最坏的情况:Introsort。
当人们谈论“快速排序”时,他们并不一定意味着任何特定的枢轴选择,所以如果不指定选择,你不能说快速排序会做什么。我认为,Hoare首次使用Quicksort描述了第一个元素作为支点,因此对于近似排序或接近逆向排序的数据来说,它的速度很慢。