zoukankan      html  css  js  c++  java
  • 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;
    }


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

  • 相关阅读:
    Java-使用IO流对大文件进行分割和分割后的合并
    Java-单向链表算法
    Java-二分查找算法
    Java-二叉树算法
    Java-对象比较器
    Android中Activity的四种开发模式
    Struts2工作原理
    C++实现单例模式
    数组中有一个数字出现的次数超过数组的一半,请找出这个数字
    c++ enum用法【转】
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4868841.html
Copyright © 2011-2022 走看看