Algorithm 深度快速排序复杂性

Algorithm 深度快速排序复杂性,algorithm,time-complexity,quicksort,partition,logarithm,Algorithm,Time Complexity,Quicksort,Partition,Logarithm,所以我有一个考试,这个考试的很大一部分是快速排序算法。众所周知,该算法的最佳情况和平均情况是:O(nlogn)。最坏的情况是O(n^2) 至于最坏的情况,我知道如何解释它:当选定的轴是数组中的最小值或最大值时,就会出现n快速排序调用,这可能需要n时间(我指的是分区操作)。我说得对吗 现在是最佳/一般情况。我读过科门斯的书,多亏了这本书,我理解了很多事情,但对于快速排序算法,他专注于如何解释O(nlogn)复杂性的数学公式。我只是想知道为什么它是O(nlogn),而不是进行一些数学证明。现在我只看

所以我有一个考试,这个考试的很大一部分是快速排序算法。众所周知,该算法的最佳情况和平均情况是:
O(nlogn)
。最坏的情况是
O(n^2)

至于最坏的情况,我知道如何解释它:当选定的轴是数组中的最小值或最大值时,就会出现
n
快速排序调用,这可能需要
n
时间(我指的是分区操作)。我说得对吗

现在是最佳/一般情况。我读过科门斯的书,多亏了这本书,我理解了很多事情,但对于快速排序算法,他专注于如何解释
O(nlogn)
复杂性的数学公式。我只是想知道为什么它是
O(nlogn)
,而不是进行一些数学证明。现在我只看到一些维基百科的解释,如果我们选择一个支点,每次将数组分成
n/2,n/2+1
部分,那么我们将有一个深度
logn
的调用树,但我不知道这是否是真的,即使是真的,为什么是
logn

我知道互联网上有很多关于快速排序的材料,但它们只涉及实现,或者只是告诉我其复杂性,而不是解释它

我说得对吗

我们会有一个深度为logn的调用树,但我不知道这是不是真的

是的

为什么是
logn

因为我们在每一步都将数组分成两半,从而得到调用图的
logn
深度。由此:

查看树及其深度,它是
logn
。想象一下,在BST中搜索需要
logn
,或者为什么在排序数组中的二进制搜索中搜索也需要
logn



附言:数学讲真话,投资于理解它们,你就会成为一名更好的计算机科学家

对于最佳情况,快速排序在每个分区步骤上将当前数组拆分为50%/50%(对半),时间复杂度为O(log2(n))(1/.5=2),但忽略常量2,因此它是O(n log(n))

如果每个分区步骤产生20%/80%的分割,那么最坏情况下的时间复杂度将基于80%或O(n log1.25(n))(1/.8=1.25),但忽略常数1.25,因此它也是O(n log(n)),即使它比排序100万个元素的50%/50%分区情况慢大约3倍


O(n^2)当分区拆分只在每个分区步骤中产生分区大小的线性减少时,就会出现时间复杂性。最简单和最坏的例子是,每个分区步骤只删除1个元素。

您了解log2是什么吗?您了解使用每个递归级别将剩余工作拆分为一半的效果吗是的,我必须找到一个数字
k
,比如
2^k=n
Yes,所以如果你去n,n/2,n/4,n/8,…,根据定义,会有log2(n)个术语。每个术语都需要
n
时间,对吗?