C++/STL Algorithms Sorting/nth element
Содержание
Finding the Median
<source lang="cpp">
- include <algorithm>
- include <vector>
- include <iostream>
using namespace std; template <class T> void print(T& c){
for( typename T::iterator i = c.begin(); i != c.end(); i++ ){ std::cout << *i << endl; }
} int main( ) {
const int len = 9; const int a[len] = { 5, 6, 4, 3,2, 6, 7, 9, 3 }; vector<int> v( a, a+len ); print( v ); // midpoint is the median nth_element( v.begin(), v.begin()+len/2,v.end() ); print( v ); cout << "\nMedian salary: " << v[len/2]; // display sorted v for clarity sort( v.begin(), v.end() ); print( v );
}
</source>
Illustrating the generic nth_element algorithm
<source lang="cpp">
- include <iostream>
- include <cassert>
- include <algorithm>
- include <vector>
using namespace std; int main() {
vector<int> v(7); v[0] = 25; v[1] = 7; v[2] = 9; v[3] = 2; v[4] = 0; v[5] = 5; v[6] = 21; const int N = 4; // Use nth_element to place the Nth smallest // element in v in the Nth position, v.begin() + N: nth_element(v.begin(), v.begin() + N, v.end()); for (int i = 0; i < N; ++i) assert (v[N] >= v[i]); for (int i = N + 1; i < 7; ++i) cout << v[N]; return 0;
} /* 99
*/ </source>
Use nth_element to extract the four highest elements
<source lang="cpp">
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference" * by Nicolai M. Josuttis, Addison-Wesley, 1999 * * (C) Copyright Nicolai M. Josuttis 1999. * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */
- include <iostream>
- include <vector>
- include <deque>
- include <list>
- include <set>
- include <map>
- include <string>
- include <algorithm>
- include <iterator>
- include <functional>
- include <numeric>
/* PRINT_ELEMENTS()
* - prints optional C-string optcstr followed by * - all elements of the collection coll * - separated by spaces */
template <class T> inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="") {
typename T::const_iterator pos; std::cout << optcstr; for (pos=coll.begin(); pos!=coll.end(); ++pos) { std::cout << *pos << " "; } std::cout << std::endl;
} /* INSERT_ELEMENTS (collection, first, last)
* - fill values from first to last into the collection * - NOTE: NO half-open range */
template <class T> inline void INSERT_ELEMENTS (T& coll, int first, int last) {
for (int i=first; i<=last; ++i) { coll.insert(coll.end(),i); }
} using namespace std; int main() {
deque<int> coll; INSERT_ELEMENTS(coll,3,7); INSERT_ELEMENTS(coll,2,6); INSERT_ELEMENTS(coll,1,5); PRINT_ELEMENTS(coll); // extract the four highest elements nth_element (coll.begin(), // beginning of range coll.end()-4, // element that should be sorted correctly coll.end()); // end of range // print them cout << "the four highest elements are: "; copy (coll.end()-4, coll.end(), ostream_iterator<int>(cout," ")); cout << endl;
} /* 3 4 5 6 7 2 3 4 5 6 1 2 3 4 5 the four highest elements are: 5 6 7 6
*/ </source>
Use nth_element to extract the four lowest elements
<source lang="cpp">
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference" * by Nicolai M. Josuttis, Addison-Wesley, 1999 * * (C) Copyright Nicolai M. Josuttis 1999. * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */
- include <iostream>
- include <vector>
- include <deque>
- include <list>
- include <set>
- include <map>
- include <string>
- include <algorithm>
- include <iterator>
- include <functional>
- include <numeric>
/* PRINT_ELEMENTS()
* - prints optional C-string optcstr followed by * - all elements of the collection coll * - separated by spaces */
template <class T> inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="") {
typename T::const_iterator pos; std::cout << optcstr; for (pos=coll.begin(); pos!=coll.end(); ++pos) { std::cout << *pos << " "; } std::cout << std::endl;
} /* INSERT_ELEMENTS (collection, first, last)
* - fill values from first to last into the collection * - NOTE: NO half-open range */
template <class T> inline void INSERT_ELEMENTS (T& coll, int first, int last) {
for (int i=first; i<=last; ++i) { coll.insert(coll.end(),i); }
} using namespace std; int main() {
deque<int> coll; INSERT_ELEMENTS(coll,3,7); INSERT_ELEMENTS(coll,2,6); INSERT_ELEMENTS(coll,1,5); PRINT_ELEMENTS(coll); // extract the four lowest elements nth_element (coll.begin(), // beginning of range coll.begin()+3, // element that should be sorted correctly coll.end()); // end of range // print them cout << "the four lowest elements are: "; copy (coll.begin(), coll.begin()+4, ostream_iterator<int>(cout," ")); cout << endl;
}
/*
3 4 5 6 7 2 3 4 5 6 1 2 3 4 5 the four lowest elements are: 2 1 2 3
*/ </source>
Use nth_element with custom function to extract the four highest elements
<source lang="cpp">
/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference" * by Nicolai M. Josuttis, Addison-Wesley, 1999 * * (C) Copyright Nicolai M. Josuttis 1999. * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */
- include <iostream>
- include <vector>
- include <deque>
- include <list>
- include <set>
- include <map>
- include <string>
- include <algorithm>
- include <iterator>
- include <functional>
- include <numeric>
/* PRINT_ELEMENTS()
* - prints optional C-string optcstr followed by * - all elements of the collection coll * - separated by spaces */
template <class T> inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="") {
typename T::const_iterator pos; std::cout << optcstr; for (pos=coll.begin(); pos!=coll.end(); ++pos) { std::cout << *pos << " "; } std::cout << std::endl;
} /* INSERT_ELEMENTS (collection, first, last)
* - fill values from first to last into the collection * - NOTE: NO half-open range */
template <class T> inline void INSERT_ELEMENTS (T& coll, int first, int last) {
for (int i=first; i<=last; ++i) { coll.insert(coll.end(),i); }
} using namespace std; int main() {
deque<int> coll; INSERT_ELEMENTS(coll,3,7); INSERT_ELEMENTS(coll,2,6); INSERT_ELEMENTS(coll,1,5); PRINT_ELEMENTS(coll); // extract the four highest elements (second version) nth_element (coll.begin(), // beginning of range coll.begin()+3, // element that should be sorted correctly coll.end(), // end of range greater<int>()); // sorting criterion // print them cout << "the four highest elements are: "; copy (coll.begin(), coll.begin()+4, ostream_iterator<int>(cout," ")); cout << endl;
}
/*
3 4 5 6 7 2 3 4 5 6 1 2 3 4 5 the four highest elements are: 6 7 6 5
*/ </source>