在c++的stl库中,提供了nth_element这样一个函数,头文件algorithm
它的用法是nth_element(a+l,a+k,a+r)
这样它会使a这个数组中区间(l,r)内的第k大的元素处在第k个位置上(相对位置)
将第k_th 元素放到它该放的位置上,左边元素都小于它,右边元素都大于它.
但是它并不保证其他元素有序!这个函数的期望复杂度是O(n)的 !
原理如下:
在当前区间[L,R]上,找一个基准位置mid
通过线性的扫描交换,
使得[L,mid)的元素都比mid小,(mid,R]的元素都比mid大
此时mid上的元素就是第mid小的
然后判断k在哪半边,继续递归处理
所以这样就达到了期望的O(N)复杂度
可以用来线性求中位数:博客链接:https://blog.csdn.net/baodream/article/details/83045492