Algorithm 快速排序到已排序的数组

Algorithm 快速排序到已排序的数组,algorithm,big-o,quicksort,Algorithm,Big O,Quicksort,在这个问题上: Alejo Hausner在《快进》中说:在最坏的情况下,快速排序的成本是 具有讽刺意味的是,如果对已排序的数组应用快速排序,可能会出现这种代价高昂的行为 我拿不到。有人能给我解释一下吗 可能是这个问题的答案,但这并没有给我一个完整的答案。根据实现情况,有几种“常用”的方法来选择轴心 一般来说,对于“未排序”的源,没有好的或坏的方法来选择它。 因此,有些实现只是将第一个元素作为轴心 对于已排序的源,这将导致可能的最差数据透视,因为最短时间间隔始终为空。 ->递归步骤=O(n),而

在这个问题上:

Alejo Hausner在《快进》中说:在最坏的情况下,快速排序的成本是

具有讽刺意味的是,如果对已排序的数组应用快速排序,可能会出现这种代价高昂的行为

我拿不到。有人能给我解释一下吗


可能是这个问题的答案,但这并没有给我一个完整的答案。

根据实现情况,有几种“常用”的方法来选择轴心

一般来说,对于“未排序”的源,没有好的或坏的方法来选择它。 因此,有些实现只是将第一个元素作为轴心

对于已排序的源,这将导致可能的最差数据透视,因为最短时间间隔始终为空。 ->递归步骤=O(n),而不是所需的O(logn)。
这会导致O(n²)复杂性,这对排序非常不利


通过随机选择轴可以避免此行为。在如上所述的每个递归中,随机选择的枢轴极不可能具有相同的不良特征


此外,由于您无法预测随机生成器的选择(如果是好的),因此无法生成故意的坏源。

根据实现情况,有几种“常用”方法可以选择轴心

一般来说,对于“未排序”的源,没有好的或坏的方法来选择它。 因此,有些实现只是将第一个元素作为轴心

对于已排序的源,这将导致可能的最差数据透视,因为最短时间间隔始终为空。 ->递归步骤=O(n),而不是所需的O(logn)。
这会导致O(n²)复杂性,这对排序非常不利


通过随机选择轴可以避免此行为。在如上所述的每个递归中,随机选择的枢轴极不可能具有相同的不良特征


此外,由于无法预测随机生成器的选择(如果是好的),因此无法生成故意的坏源。

快速排序算法如下:

  • 选择一个轴
  • 将小于轴的图元移动到起点,将大于轴的图元移动到终点
  • 现在数组看起来像
    [p]
  • 对数组的第一个和第二个“一半”进行递归排序
如果枢轴始终靠近阵列的中间,则快速排序将非常有效,运行时间接近
n log n
。如果轴是中间值,则此操作非常有效。但选择实际中值本身成本高昂。如果pivot碰巧是数组中最小或最大的元素,那么您将得到如下数组:
[p,>p,>p,>p,>p,>p,>p,>p]
。如果这种情况发生得太频繁,您的“快速排序”将有效地表现为选择排序。在这种情况下,由于要递归排序的子数组的大小在每次迭代时仅减少1,因此将存在
n
迭代级别,每个级别都需要
n
操作,因此总体复杂度将为'n^2'

现在,由于我们不愿意使用昂贵的操作来找到一个好的支点,我们不妨随机选择一个元素。由于我们也不关心任何真正的随机性,我们可以从数组中选择任意元素,例如第一个

如果数组是均匀随机洗牌的,那么选择第一个元素就很好了。你可以合理地希望它会定期给你一个“平均”元素。但是如果数组已经排序。。。根据定义,第一个元素是最小的。所以我们的情况很糟糕,复杂性是
n^2

避免“坏列表”的一个简单方法是选择一个真正的随机元素,而不是任意元素。或者,如果您有理由相信快速排序通常会在几乎已排序的列表上调用,您可以选择位置
n/2
中的元素,而不是位置1中的元素


还有几篇关于选择支点的不同方法的研究论文,精确计算了对复杂性的影响。例如,您可以选择三个随机元素,从最小到最大排列它们,并保留中间的一个。但结论通常是:如果您尝试编写更好的轴心选择,那么它的成本也会更高,而且算法的总体复杂性不会有太大的提高。

快速排序算法是这样的:

  • 选择一个轴
  • 将小于轴的图元移动到起点,将大于轴的图元移动到终点
  • 现在数组看起来像
    [p]
  • 对数组的第一个和第二个“一半”进行递归排序
如果枢轴始终靠近阵列的中间,则快速排序将非常有效,运行时间接近
n log n
。如果轴是中间值,则此操作非常有效。但选择实际中值本身成本高昂。如果pivot碰巧是数组中最小或最大的元素,那么您将得到如下数组:
[p,>p,>p,>p,>p,>p,>p,>p]
。如果这种情况发生得太频繁,您的“快速排序”将有效地表现为选择排序。在这种情况下,由于要递归排序的子数组的大小在每次迭代时仅减少1,因此将存在
n
迭代级别,每个级别都需要
n
操作,因此总体复杂度将为'n^2'

现在,由于我们不愿意使用昂贵的操作来找到一个好的支点,我们不妨随机选择一个元素。由于我们也不关心任何真正的随机性,我们可以从数组中选择任意元素,例如第一个

如果数组是均匀随机洗牌的,那么选择第一个元素就很好了。你可以合理地希望它会定期给你一个“平均”元素。但是如果数组w