我正在基于Select算法的快速排序变体实现方式,以选择一个好的枢轴元素。传统观点似乎是将数组分成5个元素的块,取每个块的中位数,然后对所得的中位数递归地应用相同的阻塞方法,以获得“中位数的中位数”。
使我困惑的是选择5元素块而不是3元素块。在我看来,使用5个元素的块执行n/4 = n/5 + n/25 + n/125 + n/625 + ...5个中值的运算,而使用3个元素的块则执行n/2 = n/3 + n/9 + n/27 + n/81 + ...3个中值的运算。由于每个5位数的中位数是6个比较,而每个3位数的中位数是2个比较,因此3*n/2使用5 n位数的中间值和使用3位数的中间值进行比较。
n/4 = n/5 + n/25 + n/125 + n/625 + ...
n/2 = n/3 + n/9 + n/27 + n/81 + ...
3*n/2
n
谁能解释这种差异,使用五元素块的动机是什么?我对应用这些算法的惯常做法并不熟悉,因此也许您可以采取一些方法削减一些步骤,并且仍然与中间值“足够接近”以确保有一个很好的枢轴,并且这种方法在5元素块的情况下效果更好?
原因是,通过选择3的块,我们可能会失去使用O(n)时间算法的保证。
对于5个块,时间复杂度为
T(n)= T(n / 5)+ T(7n / 10)+ O(n)
对于3块,结果是
T(n)= T(n / 3)+ T(2n / 3)+ O(n)
检查一下:http : //www.cs.berkeley.edu/~luca/w4231/fall99/slides/l3.pdf