Algorithm 中值选择算法

Algorithm 中值选择算法,algorithm,brute-force,median-of-medians,Algorithm,Brute Force,Median Of Medians,我试图理解寻找中位数的选择算法。我已经在下面粘贴了psuedo代码 SELECT(A[1 .. n], k): if n<=25 use brute force else m = ceiling(n/5) for i=1 to m B[i]=SELECT(A[5i-4 .. 5i], 3) mom=SELECT(B[1 ..m], floor(m/2)) r = PARTITION(A[1 .. n],mom) if k < r return SELECT(A[1 .. r-1],

我试图理解寻找中位数的选择算法。我已经在下面粘贴了psuedo代码

SELECT(A[1 .. n], k):
if n<=25
use brute force
else
m = ceiling(n/5)
for i=1 to m
B[i]=SELECT(A[5i-4 .. 5i], 3)
mom=SELECT(B[1 ..m], floor(m/2))
r = PARTITION(A[1 .. n],mom)
if k < r
return SELECT(A[1 .. r-1], k)
else if k > r
return SELECT(A[r +1 .. n], k-r)
else
return mom
选择(A[1..n],k):
如果n r
返回选择(A[r+1..n],k-r)
其他的
回报妈妈
我有一个很小的疑问。我想知道作者在上面写的暴力是什么意思,因为代码必须来自于

暴力算法可以是任何简单而愚蠢的算法。在您的示例中,您可以对25个元素进行排序,然后找到中间的元素。与选择算法相比,这既简单又愚蠢,因为排序需要
O(nlgn)
,而选择只需要线性时间


n
较小时,蛮力算法通常足够好。此外,它更容易实现。阅读有关暴力的更多信息。

一般认为,对于小输入,快速排序比插入排序慢。因此,许多实现在某个阈值下切换到插入排序

本手册中提到了这一做法。 一种商用合并排序代码,用于切换到插入排序以进行小输入。这里的阈值是7

“蛮力”几乎肯定是指这样一个事实:这里的代码使用相同的实践:插入排序,然后选择中间元素作为中间值


然而,我在实践中发现,一般来说,常识并不正确。当我运行基准测试时,这种转换要么没有什么积极影响,要么有消极影响。这是为了快速排序。在分区算法中,它更可能是负的,因为分区的一侧在每一步都会被丢弃,所以在小的输入上花费的时间更少。这一点在@Dennis对的回复中得到了验证。

这可能意味着他将只排序并选择中间值。也许把你得到这个的网站贴出来是的。蛮力将使用类似于选择排序的算法来查找中间值。