Algorithm 快速排序与中值渐近行为
快速排序和中值使用相同的方法(除法和震荡法),为什么它们具有不同的渐近行为Algorithm 快速排序与中值渐近行为,algorithm,quicksort,asymptotic-complexity,Algorithm,Quicksort,Asymptotic Complexity,快速排序和中值使用相同的方法(除法和震荡法),为什么它们具有不同的渐近行为 是因为快速排序可能没有使用正确的枢轴吗?如果使用霍尔的原始select算法,您可能会得到与快速排序相同的最坏情况性能 如果您使用中间值,那么您将限制最坏的情况,而在大多数典型情况下,您将以较慢的速度为代价 您可以使用中间值为快速排序找到一个轴心点,这将产生大致相同的效果——限制最坏的情况,但在大多数情况下会降低速度 当然,对于排序(一般而言),每个分区操作都是O(N),您希望对log(N)分区操作进行操作,因此您得到的总
是因为快速排序可能没有使用正确的枢轴吗?如果使用霍尔的原始
select
算法,您可能会得到与快速排序相同的最坏情况性能
如果您使用中间值,那么您将限制最坏的情况,而在大多数典型情况下,您将以较慢的速度为代价
您可以使用中间值为快速排序找到一个轴心点,这将产生大致相同的效果——限制最坏的情况,但在大多数情况下会降低速度
当然,对于排序(一般而言),每个分区操作都是O(N),您希望对log(N)分区操作进行操作,因此您得到的总体复杂度大约是O(N log N)
中位数发现,你也希望做大约O(log n)步骤,但是你只考虑上一步的分区,可以包括中值(或四分位数等等)。您希望这些分区的大小在每一步都被(大约)2除,而不是总是必须对整个输入进行分区,因此最终的复杂性大约是O(N)而不是O(N logn)
[请注意,在整个过程中,我有点滥用big-O表示法来表示预期的复杂度,而big-O实际上应该表示上界(即最坏情况)复杂度。]如果使用霍尔最初的
选择算法,您可以得到与快速排序相同的糟糕情况性能
如果您使用中间值,那么您将限制最坏的情况,而在大多数典型情况下,您将以较慢的速度为代价
您可以使用中间值为快速排序找到一个轴心点,这将产生大致相同的效果——限制最坏的情况,但在大多数情况下会降低速度
当然,对于排序(一般而言),每个分区操作都是O(N),您希望对log(N)分区操作进行操作,因此您得到的总体复杂度大约是O(N log N)
中位数发现,你也希望做大约O(log n)步骤,但是你只考虑上一步的分区,可以包括中值(或四分位数等等)。您希望这些分区的大小在每一步都被(大约)2除,而不是总是必须对整个输入进行分区,因此最终的复杂性大约是O(N)而不是O(N logn)
[请注意,在整个过程中,我有点滥用big-O表示法来表示预期的复杂度,而big-O实际上应该表示上界(即最坏情况)复杂度。]如果使用霍尔最初的选择算法,您可以得到与快速排序相同的糟糕情况性能
如果您使用中间值,那么您将限制最坏的情况,而在大多数典型情况下,您将以较慢的速度为代价
您可以使用中间值为快速排序找到一个轴心点,这将产生大致相同的效果——限制最坏的情况,但在大多数情况下会降低速度
当然,对于排序(一般而言),每个分区操作都是O(N),您希望对log(N)分区操作进行操作,因此您得到的总体复杂度大约是O(N log N)
中位数发现,你也希望做大约O(log n)步骤,但是你只考虑上一步的分区,可以包括中值(或四分位数等等)。您希望这些分区的大小在每一步都被(大约)2除,而不是总是必须对整个输入进行分区,因此最终的复杂性大约是O(N)而不是O(N logn)
[请注意,在整个过程中,我有点滥用big-O表示法来表示预期的复杂度,而big-O实际上应该表示上界(即最坏情况)复杂度。]如果使用霍尔最初的选择算法,您可以得到与快速排序相同的糟糕情况性能
如果您使用中间值,那么您将限制最坏的情况,而在大多数典型情况下,您将以较慢的速度为代价
您可以使用中间值为快速排序找到一个轴心点,这将产生大致相同的效果——限制最坏的情况,但在大多数情况下会降低速度
当然,对于排序(一般而言),每个分区操作都是O(N),您希望对log(N)分区操作进行操作,因此您得到的总体复杂度大约是O(N log N)
中位数发现,你也希望做大约O(log n)步骤,但是你只考虑上一步的分区,可以包括中值(或四分位数等等)。您希望这些分区的大小在每一步都被(大约)2除,而不是总是必须对整个输入进行分区,因此最终的复杂性大约是O(N)而不是O(N logn)
[请注意,在整个过程中,我有点滥用big-O表示法来表示预期的复杂性,而big-O实际上应该表示上界(即最坏情况)复杂性。]当您在(请参阅链接中的方法)中使用methodpartition
来查找中位数时,具有正确位置的元素的方法返回索引,基于此位置,您只需检查包含中间值的选定零件
例如,数组长度是5,所以中位数是3。分区方法返回2,因此您只需检查数组的上部(从2到5),而不是整个数组作为快速排序。当您在(请参阅链接中的方法)中使用方法partition
查找中位数时,具有正确位置的元素的方法返回索引,基于此位置,您只需