С++ для начинающих

Алгоритм 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_iterator<int> 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(),   greater<int>() );

           copy( vec.begin(), vec.end(), out ); cout << endl;

}



Содержание раздела