STL 源代码分析 算法 stl_algo.h -- pre_permutation

本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie

pre_permutation

----------------------------------------------------------------

描写叙述: 取得 [first, last) 所标示之序列的前一个排列组合。

假设没有,返回 false,有,返回true

思路:

从后往前

1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i > *ii

2.找出第一个小于 *i 的元素,令其为 *j。将*i,*j元素对调

3.将ii右端的全部元素颠倒

template <class BidirectionalIterator>
bool prev_permutation(BidirectionalIterator first,
                      BidirectionalIterator last) {
  if (first == last) return false;
  BidirectionalIterator i = first;
  ++i;
  if (i == last) return false;
  i = last;
  --i;

  for(;;) {
    BidirectionalIterator ii = i;
    --i;
    if (*ii < *i) {  //满足 *ii < *i --> next_permutation 时的条件是 *i < *ii
      BidirectionalIterator j = last;
      while (!(*--j < *i)); // 找到满足 *j < *i 的 *j --> next_permutation 时的条件是 *i < *j
      iter_swap(i, j);
      reverse(ii, last);
      return true;
    }
    if (i == first) {
      reverse(first, last);
      return false;
    }
  }
}

演示样例:

int main()
{
  int A[] = {2, 3, 4, 5, 6, 1};
  const int N = sizeof(A) / sizeof(int);

  cout << "Initially:              ";
  copy(A, A+N, ostream_iterator<int>(cout, " "));
  cout << endl;

  prev_permutation(A, A+N);
  cout << "After prev_permutation: ";
  copy(A, A+N, ostream_iterator<int>(cout, " "));
  cout << endl;

  next_permutation(A, A+N);
  cout << "After next_permutation: ";
  copy(A, A+N, ostream_iterator<int>(cout, " "));
  cout << endl;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-11 21:13:04

STL 源代码分析 算法 stl_algo.h -- pre_permutation的相关文章

STL 源代码分析 算法 stl_algo.h -- includes

本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------------------------------------- 描写叙述:S1和S2都必须是有序集合.推断序列二 S2 是否"涵盖于"序列一 S1,即"S2的每个元素是否都出现于 S1中" 思路: 1.遍历两个区间.直到当中一个走完 2.假设序列二的元素小于序列一的元素

STL 源代码分析 算法 stl_algo.h -- binary_search

本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie binary_search ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 描

STL 源代码剖析 算法 stl_algo.h -- search

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search ------------------------------------------------------------------------- 描写叙述:在序列一[first1, last1) 所涵盖的区间中.查找序列二[first2, last2) 的首次出现点. 思路: 1.遍历序列二 2.假设两序列的当前元素一样,都前进 1 3.否则序列二的迭代器又一次指向開始元素

STL 源代码分析 算法 stl_heap.h

本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie heap ------------------------------------------------------------------------- binary heap 是一种全然二叉树. 隐式表示法:以 array 表述 tree. 小技巧:将 array 的 #0 元素保留.则第 i 个元素的左右子节点各自是 2i 和 2i + 1, 父节点是i/2 --> STL 里没有

STL 源代码剖析 算法 stl_algo.h -- equal_range

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie equal_range(应用于有序区间) -------------------------------------------------------------------------------------------------------------------------------------- 描写叙述:利用二分查找找到一个区间,区间里的全部值都等于给定值,返回的是一个pa

STL 源代码剖析 算法 stl_algo.h -- inplace_merge

本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie inplace_merge(应用于有序区间) -------------------------------------------------------------------- 描写叙述:假设两个连接在一起的序列[first, middle)和 [middle, last]都已排序, 那么 inplace_merge 可将它们结合成单一一个序列,并仍有序. 源代码: template

STL 源代码剖析 算法 stl_algo.h -- lower_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie lower_bound(应用于有序区间) -------------------------------------------------------------------------------------------------------------------------- 描写叙述:二分查找,返回一个迭代器指向每个"不小于 value "的元素, 或 value 应

STL 源代码剖析 算法 stl_algo.h -- rotate

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie rotate -------------------------------------------------------------- 描写叙述:将[first, middle) 内的元素和[middle, last) 内的元素互换. /*------------------------------------------------------------ *分派函数(dispatc

STL 源码剖析 算法 stl_algo.h -- pre_permutation

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie pre_permutation ---------------------------------------------------------------- 描述: 取得 [first, last) 所标示之序列的前一个排列组合.如果没有,返回 false,有,返回true 思路: 从后往前 1.找两个相邻元素,令左端的元素为*i,右端的元素为*ii,且满足 *i > *ii 2.找出