若是讓你求區間第\(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