STL 中排序和通用的算法( 14 个 )

1. inplace_merge: 合并两个有序序列, 结果序列覆盖两端范围
template <class BidirectionalIterator>
  void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
                       BidirectionalIterator last );

eg:	int Array1[] = { 20, 10, 30, 50, 40 };
	int Array2[] = { 11, 31, 21, 51, 41 };
	vector<int> ivec(10);
	sort( Array1, Array1 + sizeof(Array1) );
	sort( Array2, Array2 + sizeof(Array2) );
	copy( Array1, Array1 + sizeof(Array1), ivec.begin() );
	copy( Array2, Array2 + sizeof(Array2), ivec.begin() + sizeof(Array1) );
	inplace_merge( ivec.begin(), ivec.begin() + sizeof(Array1), ivec.end() );
 
2. merge: 合并两个有序序列,存放到另一个序列中。
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result )
{
  while (true) {
    *result++ = (*first2<*first1)? *first2++ : *first1++;
    if (first1==last1) return copy(first2,last2,result);
    if (first2==last2) return copy(first1,last1,result);
  }
}

eg:
	
	sort( Array1, Array1 + sizeof(Array1) );
	sort( Array2, Array2 + sizeof(Array2) );
	merge( Array1, Array1 + sizeof(Array1), Array2,
		Array2 + sizeof(Array2), ivec.begin() );

3. random_shuffle : 对指定范围内的元素随机调整次序。

template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                        RandomNumberGenerator& rand )
{
  iterator_traits<RandomAccessIterator>::difference_type i, n;
  n = (last-first);
  for (i=n-1; i>0; --i) swap (first[i],first[rand(i+1)]);
}


4. nth_element: 将范围内的序列重新排序,小于第n个的元素放在他的前面,而大于它的都出现在后面。

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 );
eg:
	nth_element( ivec.begin(), ivec.begin() + 3, ivec.end() );
5. partial_sort : 对序列进行部分排序, 被排序的元素个数正好可以被放到范围内。 
6. partial_sort_copy: 排序后将结果放在另一个容器中,拷贝的元素个数,由另一个容器的Size决定
template <class RandomAccessIterator>
  void partial_sort ( RandomAccessIterator first, RandomAccessIterator middle,
                      RandomAccessIterator last );

template <class RandomAccessIterator, class Compare>
  void partial_sort ( RandomAccessIterator first, RandomAccessIterator middle,
                      RandomAccessIterator last, Compare comp );
template <class InputIterator, class RandomAccessIterator>
  RandomAccessIterator
    partial_sort_copy ( InputIterator first,InputIterator last,
                        RandomAccessIterator result_first,
                        RandomAccessIterator result_last );

template <class InputIterator, class RandomAccessIterator, class Compare>
  RandomAccessIterator
    partial_sort_copy ( InputIterator first,InputIterator last,
                        RandomAccessIterator result_first,
                        RandomAccessIterator result_last, Compare comp );


eg:
	partial_sort( ivec.begin(), ivec.begin() + 6, ivec.end() );
	
7. partition: 对指定范围内的元素重新排序,使用输入的函数,把结果为true的元素放在结果为false的元素之前。
template <class BidirectionalIterator, class Predicate>
  BidirectionalIterator partition ( BidirectionalIterator first,
                                    BidirectionalIterator last, Predicate pred )
{
  while (true)
  {
    while (first!=last && pred(*first)) ++first;
    if (first==last--) break;
    while (first!=last && !pred(*last)) --last;
    if (first==last) break;
    swap (*first++,*last);
  }
  return first;
}

eg:
	partition( ivec.begin(), ivec.end(), fun );

8. reverse: 将指定范围内元素重新反序排序。
9. reverse_copy :与reverse类似,不过将结果写入另一个容器。原容器中的元素顺序不变

template <class BidirectionalIterator>
  void reverse ( BidirectionalIterator first, BidirectionalIterator last)
{
  while ((first!=last)&&(first!=--last))
    swap (*first++,*last);
}

template <class BidirectionalIterator, class OutputIterator>
  OutputIterator reverse_copy ( BidirectionalIterator first,
                                BidirectionalIterator last, OutputIterator result )
{
  while (first!=last) *result++ = *--last;
  return result;
}

10. rotate : 将指定范围内的元素移到容器末尾, 由middle指向的元素成为容器的第一个元素。
11. rotate_copy: 将rotate后的元素输出到新的容器中。

template <class ForwardIterator>
  void rotate ( ForwardIterator first, ForwardIterator middle,
                ForwardIterator last )
{
  ForwardIterator next = middle;
  while (first!=next)
  {
    swap (*first++,*next++);
    if (next==last) next=middle;
    else if (first == middle) middle=next;
  }
}

template <class ForwardIterator, class OutputIterator>
  OutputIterator rotate_copy ( ForwardIterator first, ForwardIterator middle,
                               ForwardIterator last, OutputIterator result )
{
  result=copy (middle,last,result);
  return copy (first,middle,result);
}

12. sort : 升序排序
13. stable_sort :同sort,但保留相等元素之间的顺序关系
14. stable_partition :同partition 不保留容器中的相对位置。
template <class BidirectionalIterator, class Predicate>
  BidirectionalIterator stable_partition ( BidirectionalIterator first,
                                           BidirectionalIterator last,
                                           Predicate pred );



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值