问题提出
如何在尽可能少的时间内找出一个数组的中位数?简单粗暴的做法是先排序,再按照次序选择相应的数据。这种算法的时间复杂度主要依赖于排序算法的复杂度,快排可以将其降到O(nlog(n))。
本文介绍一种时间复杂度为O(n)的算法。
主要思路
思路是寻找第n大的元素,在一个序列中确定第一个元素的位置,将其置于正确的位置(即它左边的元素都小于它,右边的元素都大于它)。假设这个位置是k
,如果k=n
,很幸运,已经找到了,算法结束;如果k<n
,则递归的在左边寻找;如果k>n
,则递归的在右边寻找。
代码(c++)
1 |
|
总结
这其实是利用了快排的思想,却做了一定的优化:毕竟不需要真正的排序,只需要找到特定位置的元素。