nth_element函數原型有四個,詳細我就不一一累贅了,我們就用最普通的用法尋找第k位置的元素。
函數用法為:nth_element(first,kth,end)。
first,last 第一個和最后一個迭代器,也可以直接用數組的位置。
kth,要定位的第k個元素,能對它進行隨機訪問.
將第k_th元素放到它該放的位置上,左邊元素都小於等於它,右邊元素都大於等於它.
例如:
1 vector<int> a(9); 2 for(int i = 0; i < 9; i++) 3 a[i] = i+1; 4 random_shuffle(a.begin(),a.end()); 5 for(int i = 0; i < 9; i++) 6 cout << a[i] << " "; 7 cout << endl; 8 9 nth_element(a.begin(),a.begin()+4,a.end()); 10 cout << *(a.begin()+4) << endl; 11 12 for(int i = 0; i < 9; i++) 13 cout << a[i] << " "; 14 cout << endl;
結果為:
可以發現函數只是把kth的元素放在了正確位置,對其他元素並沒有排序,所以可以利用這個函數快速定位第k個元素,當然,這個函數也支持你直接寫比較函數,此處不再累贅因為ACM中基本不會用到。
那么為什么要選擇這個函數呢,這就和復雜度有關了,nth_element的空間復雜度為O(1),在數據量大的時候時間復雜度為O(n),數據少的情況最壞為O(n^2),因為函數原理是隨機訪問,但實際運用過程中,基本都會是O(n)的時間復雜度。所以說是非常迅速的。