zoukankan      html  css  js  c++  java
  • C++ 全排列函数 std::next_permutation与std::prev_permutation

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序、std::prev_permutation提供降序。

    1.std::next_permutation函数原型

      template <class BidirectionalIterator>

      bool next_permutation (BidirectionalIterator first, BidirectionalIterator last );

      template <class BidirectionalIterator, class Compare>

      bool next_permutation (BidirectionalIterator first,BidirectionalIterator last, Compare comp);

    说明:next_permutation,重新排列范围内的元素[第一,最后一个)返回按照字典序排列的下一个值较大的组合。

    返回值:如果有一个更高的排列,它重新排列元素,并返回true;如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false。

    2.代码实例

     1 #include <iostream>
     2 #include <algorithm>    /// next_permutation, sort
     3 using namespace std;
     4 int main () {
     5   int myints[] = {1,2,3,1};
     6   sort (myints,myints+4);
     7 
     8   do {
     9     cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << ' '<< myints[3]<<'
    ';
    10   } while ( next_permutation(myints,myints+4) );    ///获取下一个较大字典序排列
    11 
    12   cout << "After loop: " << myints[0] << ' ' << myints[1] << ' ' << myints[2] << ' '<< myints[3] <<'
    ';
    13   return 0;
    14 }

    输出:

    3.算法实现原理

    见:http://hi.baidu.com/bellgrade/item/70b65b8a7ea3c9c398255fd4

    算法描述:

    1、从尾部开始往前寻找两个相邻的元素

    第1个元素i,第2个元素j(从前往后数的),且i<j

    2、再从尾往前找第一个大于i的元素k。将i、k对调

    3、[j,last)范围的元素置逆(颠倒排列

  • 相关阅读:
    多线程--同步--方法块和同步块synchronized
    CentOS7.6安装Nodejs(Npm)
    [原][译]关于osgEarth::VirtualProgram说明
    [转]opengl的学习网站
    [转]OpenGL中的功能与OSG对应功能
    [原]最简单的c语言,出错输出,日志打印 以及 C预定义的宏
    [转]netcdf入门
    [NetCDF][C++] 使用NetCDF 的接口读取数值
    [python] pip安装国外软件库(包)失败,解决方案
    [原][python]安装python,读取、遍历excel表格
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/3662986.html
Copyright © 2011-2022 走看看