若是让你求区间第\(k\)大,你会怎么作呢?ios
主席树?确实是个不错的选择(不过像我这种垃圾仍是乖乖打暴力吧)
在c++的stl库中,提供了nth_element
这样一个函数c++
它的用法是nth_element(a+l,a+k,a+r)
数组
这样它会使a这个数组中区间\([l,r)\)内的第\(k\)小的元素处在第\(k\)个位置上(相对位置)函数
可是它并不保证其余元素有序!
不过根据网友的实验,貌似在vs上是有序的,不过在dev中是无序的spa
时间复杂度:\(O(n)\)code
#include<iostream> #include<algorithm> using namespace std; int main() { static int a[15] = {0, 1, 2, 5, 7, 3, 4, 1}; nth_element(a + 1, a + 4, a + 8); for (int i = 1; i <= 8; i++) printf("%d ", a[i]); printf("\n"); return 0; }
输出结果blog