nth_element用於排序乙個區間,它使得位置n上的元素正好誰全排序情況下的第n個元素,而且,當nth_element返回的時候,所有按照全排序規則排在位置n之前的元素也都排在位置n之前,按照全排序規則排在n之後的元素全都排在位置n之後。
所以,我們使用nth_element既可以尋找最好的前k個元素,也可以尋找第k大元素。
先看示例:
#include #include #include using namespace std;
int main()
; nth_element(a, a + 5, a + 10, std::greater());
cout << "陣列中的中間元素是" << a[5] << endl;
nth_element(a, a, a + 10, std::greater());
cout << "陣列中第1大元素為" << a[0] << endl;
nth_element(a, a + 1, a + 10, std::greater());
cout << "陣列中第2大元素是" << a[1] << endl;
}
結果為:
陣列中的中間元素是5
陣列中第1大元素為10
陣列中第2大元素是9
請按任意鍵繼續. . .
找陣列中第k大的數
但會修改陣列中的資料,所以這裡有新的不修改資料的思路 1 用multiset實現自動排序,大小為k,每個數與set中最大的數比較,如果小於則替換。2 可以用最大堆來實現,方法類似上面的。關鍵是看 注釋在下面。時間複雜度為 include include includeusing namespace ...
找第K大或者小的數
這個題的解法 可以先通過排序得到第k個數即是第k大數。第二種解法就是利用快速排序的partition,這是一種隨機演算法,最壞情況下是n平方的,但是 平均情況下是 線性的。如下 此劃分的原理為,預設將地位的資料儲存,然後利用這個位置作為緩衝,不斷賦值。其中start永遠指向空位。最後將儲存的資料放入...
線性時間選擇問題(找第k大的數)
給定線性序集中n個元素和乙個整數k,n 2000000,1 k n,要求找出這n個元素中第k小的數。第一行有兩個正整數n,k.接下來是n個整數 0 ai 1e9 輸出第k小的數 6 31 3 5 2 4 6 定義陣列a存放資料,由於資料較多,用scanf進行輸入。陣列從0開始存入資料,所以第k大的數...