nth_element()

指导博文http://blog.csdn.net/Simba888888/article/category/1464971

本文介绍 STL 算法库中 nth_elemnt 的实现代码。 

STL 采用的算法是: 当数组长度 <= 3时, 采用插入排序。

                                  当长度 > 3时, 采用快排 Partition 的思想;

template <class _RandomAccessIter, class _Tp>
_RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
                                        _RandomAccessIter __last, 
                                        _Tp __pivot) 
{
  while (true) {
    while (*__first < __pivot)
      ++__first;
    --__last;
    while (__pivot < *__last)
      --__last;
    if (!(__first < __last))
      return __first;
    iter_swap(__first, __last);
    ++__first;
  }
}
// nth_element() and its auxiliary functions.  

template <class _RandomAccessIter, class _Tp>
void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
                   _RandomAccessIter __last, _Tp*) {
  while (__last - __first > 3) {
    _RandomAccessIter __cut =
      __unguarded_partition(__first, __last,
                            _Tp(__median(*__first,
                                         *(__first + (__last - __first)/2),
                                         *(__last - 1))));
    if (__cut <= __nth)
      __first = __cut;
    else 
      __last = __cut;
  }
  __insertion_sort(__first, __last);
}

template <class _RandomAccessIter>
inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
                        _RandomAccessIter __last) {
  __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
                 _LessThanComparable);
  __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));
}

例子:

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

int main(void)
{
  int a[]={3,5,2,6,1,4};

  nth_element(a, a+3, a+sizeof(a)/sizeof(int));
  cout << "The fourth element is: " << a[3] << endl; 
  
  // output array a[]
  copy(a, a+sizeof(a)/sizeof(int), 
          ostream_iterator<int>(cout, " "));
  return 0;
}


你可能感兴趣的:(nth_element())