C++编程笔记之next_permutation

来源:互联网 发布:java replace first 编辑:程序博客网 时间:2024/06/13 22:49

STL中的next_permutation是得到序列的下一个全排列序列。

1、next_permutation

首先,从右至左找到第一个左边值n[i]小于右边值n[i+1];
然后,从右搜索第一个大于n[i]的值n[j],将n[i]与n[j]互换;
最后,将n[i+1]之后的全部reverse。

template <class _BidirectionalIter>bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {  __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);  __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,                 _LessThanComparable);  if (__first == __last)//没有元素,直接返回false    return false;  _BidirectionalIter __i = __first;  ++__i;  if (__i == __last)//如果只有一个元素,也返回false    return false;  __i = __last;  --__i;  for(;;) {    _BidirectionalIter __ii = __i;//从右至左第一个元素    --__i;//从右至左第二个元素    if (*__i < *__ii) {//如果找到第一个左边元素小于右边的时候      _BidirectionalIter __j = __last;      while (!(*__i < *--__j))//从右边搜索,找到第一个大于i所对应的元素        {}      iter_swap(__i, __j);//交换i,j      reverse(__ii, __last);//i+1包括i+1之后的元素reverse。      return true;    }    if (__i == __first) {//如果当前的序列已经是最后一个序列,直接reverse      reverse(__first, __last);      return false;    }  }}

pre_permutation则刚好相反,只需要把比较关系反转即可。

由于字典序是完全按照大小进行排列的,所以就算有重复的元素,仍然是相同的序列。

2、使用next_permutation实现有重复的全排列

#include<iostream>#include<algorithm>using namespace std;int main(){    int ans[4]={1,2,2,4};       do                                 {        for(int i=0;i<4;++i)            cout<<ans[i]<<" ";        cout<<endl;    }while(next_permutation(ans,ans+4));    return 0;}

结果:
这里写图片描述

3、递归实现全排列

#include<vector>#include<iostream>void swap(int& x, int& y){    int tmp = x;    x = y;    y = tmp;}void permutation(vector<int> nums, int i){   int len = nums.size();   if (i == len){     for(i = 0;i < len;i++){     cout<<nums[i]<<' ';     }     cout<<'\n';     return;   }     else{        for (int j = i; j < len; j++){          if(nums[i] == nums[j] && j != i)continue;          swap(nums[i], nums[j]);          permutation(nums, i+1);          swap(nums[i], nums[j]);       }   }};int main(){  vector<int> nums={1,2,2,4};  solution result;  result.permutation(nums,0);}
原创粉丝点击