我们可以选择3个元素分区的中位数来实现快速排序。同样,我们可以选择5、7或11个元素的中位数来实现快速排序吗?如果是,那又是怎么回事?
你应该看看中位数的中位数算法。它是一个线性时间算法,具有以下递归式…
T(n) ≤ T(n/5) + T(7n/10) + O(n)
…也就是O(n)算法细节…
- 将列表划分为n/5个子序列,每个子序列有5个元素
- 查找每个列表的中位数,通过暴力破解。将会有n/5的
- 1,……m_n/5是这些中位数。
- 递归地找到这些中位数的中位数。这是1个元素,主元!
…还有一些伪代码…
MedianOfMedians (A[1],...,A[n])
begin
for i=1 to n/5 do {
let m_i be the median of A[5i − 4], A[5i − 3],..., A[5i];
}
pivot = Select(m1,...,m_n/5, n/10); // the pivot
return pivot
end
引用
- http://en.wikipedia.org/wiki/Selection_algorithm Linear_general_selection_algorithm_ -_Median_of_Medians_algorithm
- Java中位数的中位数
- http://www.cs.berkeley.edu/卢卡/w4231 fall99/幻灯片/l3.pdf
- http://www.soe.ucsc.edu/classes/cmps102/Spring05/selectAnalysis.pdf
- http://webee.technion.ac.il/courses/044268/w0809_website/recitations/Median.pdf
我希望这对你有帮助。斯托伊
- 中位数算法是一种确定性线性时间算法选择算法。
- 使用此算法,可以改进快速排序算法!
- 平均情况时间复杂度为0 (nlogn),
- 最坏情况下的时间复杂度为O(n2) n方。
然而,我们可以使用中位数的中位数来改进它。
kthSmallest (arr [0 . .n - 1), k)
-
将arr[]分成≤n/5≤5的组
除了最后一组元素可能少于5个 -
对以上创建的≤n/5≤组进行排序,求所有组的中位数组。创建一个辅助数组'median[]'并存储中位数
中位数数组中所有的组 -
//递归调用此方法查找中位数[0..≤≤n/5≤≤1]的中位数medOfMed = kthSmallest(median[0..]⌈n/5⌉1],⌈n/10⌉)
-
在medOfMed周围划分arr[]并获取其位置。pos = partition(arr, n, medOfMed)
-
如果pos == k return medOfMed
-
If pos>k返回kthSmallest(arr[1 ..]pos-1), k)
-
If pos <k返回kthSmallest(arr[pos+1..])r],>
现在时间复杂度为:O(n)