std::nth_element()是一種STL算法,它以如下方式重新排列列表,即,如果對列表進行排序,則位於第n個位置的元素應位於該位置。
它不對列表進行排序,隻是第n個元素之前的所有元素都不大於該元素,而後繼該元素的所有元素也不小於該元素。
它有兩個版本,定義如下:
-
使用“比較元素”
用法:
template void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); first: Random-access iterator to the first element in the list. last: Random-access iterator to the last element in the list. nth: Random-access iterator pointing to the position in the list, which should be sorted. If it points to end, then this function will do nothing. 返回值:Since, return type is void, so it doesnot return any value.
// C++ program to demonstrate the use of std::nth_element #include <iostream> #include <algorithm> using namespace std; int main() { int v[] = { 3, 2, 10, 45, 33, 56, 23, 47 }, i; // Using std::nth_element with n as 5 std::nth_element(v, v + 4, v + 8); // Since, n is 5 so 5th element should be sorted for (i = 0; i < 8; ++i) { cout << v[i] << " "; } return 0; }
輸出:
3 2 10 23 33 56 45 47
在這裏,第五個元素為33,其左側的所有元素都小於它,而其右側的所有元素都大於它。
- 通過使用預定義函數進行比較:
用法:
template void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); Here, first, last and nth arguments are the same as previous case. comp: Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines. The function shall not modify any of its arguments. This can either be a function pointer or a function object. 返回值: Since, its return type is void, so it doesnot return any value.
// C++ program to demonstrate the use of std::nth_element #include <iostream> #include <algorithm> using namespace std; // Defining the BinaryFunction bool comp(int a, int b) { return (a < b); } int main() { int v[] = { 3, 2, 10, 45, 33, 56, 23, 47 }, i; // Using std::nth_element with n as 6 std::nth_element(v, v + 5, v + 8, comp); // Since, n is 6 so 6th element should be the same // as the sixth element present if we sort this array // Sorted Array /* 2 3 10 23 33 45 47 56 */ for (i = 0; i < 8; ++i) { cout << v[i] << " "; } return 0; }
輸出:
33 2 10 23 3 45 47 56
在此代碼中,由於std::nth_element中第二個參數所指向的第n個元素是數組v的第六個元素,因此這意味著應用std::nth_element之後數組中的第六個元素應為如果整個數組都排序了,那就是45。
而且其左側的所有元素都小於或等於它,而右側的元素也大於它。
二進製函數comp:std::nth_element的目的是對範圍[first,last)進行升序排序,以使條件* i
我們在哪裏可以應用std::nth_element()?
- 如果我們要查找前n個最小的數字,則可以使用它,但是它們可以排序或可以不排序。
// C++ program to find first n smallest numbers #include <iostream> #include <algorithm> using namespace std; int main() { int v[] = { 30, 20, 10, 40, 60, 50, 70, 80 }, i; // Using std::nth_element with n as 3 std::nth_element(v, v + 2, v + 8); // Since, n is 3 so now first three numbers will be the // three smallest numbers in the whole array // Displaying first three smallest number for (i = 0; i < 3; ++i) { cout << v[i] << " "; } return 0; }
輸出:
20 10 30
- 就像前n個最小的數字一樣,我們也可以通過更改std::nth_element中作為參數傳遞的二進製函數來找到前n個最大的數字。
// C++ program to find first n largest numbers #include <iostream> #include <algorithm> using namespace std; int main() { int v[] = { 30, 20, 50, 60, 70, 10, 80, 40 }, i; // Using std::nth_element with n as 2 std::nth_element(v, v + 1, v + 8, std::greater<int>()); // Since, n is 2 so first 2 elements will be the largest // among all the array elements // Displaying First 2 elements for (i = 0; i < 2; ++i) { cout << v[i] << " "; } return 0; }
輸出:
80 70
在這裏,我們超越了
()作為二進製函數,因此如果我們按降序對給定數組進行排序,則第n個元素將成為第n個元素,因此前n個元素將是前n個最大元素。 - 它可以用來找到給定元素的中位數。
// C++ program to find the median of the vector #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> v = { 3, 2, 10, 45, 33, 56, 23, 47, 60 }, i; // Using std::nth_element with n as v.size()/2 + 1 std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end()); cout << "The median of the array is " << v[v.size() / 2]; return 0; }
輸出:
The median of the array is 33
這裏排序的數組將是2 3 10 23 33 45 47 56 60,因此有9個元素,中位數將是中間元素,即第5個元素:33。
std::nth_element()的時間複雜度:O(n),其中n是第一個和最後一個之間的距離。
相關文章:
相關用法
注:本文由純淨天空篩選整理自 std::nth_element in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。