在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