stl 全排列函数 next_permutation

做题时,遇到了,记录一下

一、基础概念

next_permutation需要头文件<algorithm>

next_permutation的时间复杂度是O(n)

next_permutation可以有两个或三个参数,类似于sort函数

 

next_permutation函数

返回值:如果没有下一个排列组合,返回false,否则返+回true。

 

注意,如果想获得所有的排列组合,那么我们的数据初始排列应该是升序的

二、实验

实验1

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

vector<int> ve;
int main(){

    ve.push_back(10);
    ve.push_back(20);
    ve.push_back(30);

    
    do
    {
        cout<<ve[0]<<"\t"<<ve[1]<<"\t"<<ve[2]<<endl; 
    }while(next_permutation(ve.begin() , ve.end() ) );
    
    return 0;
}

 

 

全的全排列 

 

再看非升序实验

实验2

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

vector<int> ve;
int main(){

    ve.push_back(30);
    ve.push_back(10);
    ve.push_back(20);

    
    do
    {
        cout<<ve[0]<<"\t"<<ve[1]<<"\t"<<ve[2]<<endl; 
    }while(next_permutation(ve.begin() , ve.end() ) );
    
    return 0;
}

 

 只有两例

 

实验3

简单的实现了一下3个参数的next_permutation函数

#include <iostream>
#include <algorithm>

using namespace std;

typedef struct _TEST
{
    int num;
    string name;
} TEST,pTEST;


int main(){
    TEST test[3];
    test[0] = {1,"刘备"};
    test[1] = {2,"关羽"};
    test[2] = {3,"张飞"};
    
    do
    {
        cout<<test[0].name<<"\t"<<test[1].name<<"\t"<<test[2].name<<endl;
        cout<<test[0].num<<"\t"<<test[1].num<<"\t"<<test[2].num<<endl;
    }while(next_permutation(test,test+3,[=](const TEST &a,const TEST &b){
        return a.num > b.num;
    }));
    
    
    return 0;
}

 

posted @ 2022-04-07 15:19  TLSN  阅读(202)  评论(0)    收藏  举报