Алгоритм nth_element()
Алгоритм nth_element()
template class RandomAccessIterator
void
nth_element( RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last );
template class RandomAccessIterator, class Compare
void
nth_element( RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last, Compare comp );
nth_element() переупорядочивает последовательность, ограниченную диапазоном [first,last), так что все элементы, меньшие чем тот, на который указывает итератор nth, оказываются перед ним, а все большие элементы - после. Например, если есть массив
int ia[] = {29,23,20,22,17,15,26,51,19,12,35,40};
то вызов nth_element(), в котором nth указывает на седьмой элемент (его значение равно 26):
nth_element( &ia[0], &ia[6], &ia[2] );
генерирует последовательность, в которой семь элементов, меньших 26, оказываются слева от 26, а четыре элемента, больших 26, справа:
{23,20,22,17,15,19,12,26,51,35,40,29}
При этом не гарантируется, что элементы, расположенные по обе стороны от nth, упорядочены. В первом варианте для сравнения используется оператор "меньше", определенный для типа элементов контейнера, во втором - бинарная операция сравнения, заданная программистом.
#include algorithm
#include vector
#include iostream.h
/* печатается:
исходный вектор: 29 23 20 22 17 15 26 51 19 12 35 40
вектор, отсортированный относительно элемента 26
12 15 17 19 20 22 23 26 51 29 35 40
вектор, отсортированный по убыванию относительно элемента 23
40 35 29 51 26 23 22 20 19 17 15 12
*/
int main()
{
int ia[] = {29,23,20,22,17,15,26,51,19,12,35,40};
vector int,allocator vec( ia, ia+12 );
ostream_iteratorint out( cout," " );
cout "исходный вектор: ";
copy( vec.begin(), vec.end(), out ); cout endl;
cout "вектор, отсортированный относительно элемента "
*( vec.begin()+6 ) endl;
nth_element( vec.begin(), vec.begin()+6, vec.end() );
copy( vec.begin(), vec.end(), out ); cout endl;
cout " вектор, отсортированный по убыванию "
"относительно элемента "
*( vec.begin()+6 ) endl;
nth_element( vec.begin(), vec.begin()+6,
vec.end(), greaterint() );
copy( vec.begin(), vec.end(), out ); cout endl;
}