<span style="font-family: sans-serif; ">next_permutation (BidirectionalIterator first, BidirectionalIterator last):n个元素有n!种排列。这些排列中,规定升序序列为最小排列,降序序列为最大的排列,任意两个排列按照字典序分出大小。该函数返回当前序列作为一个排列按字典序的下一个排列。</span>
prev_permutation(BidirectionalIterator first, BidirectionalIterator last): 返回当前序列作为一个排列按字典序的上一个排列。
所以 输入数据要先排序(排成升序或降序)在调用 permutation()函数;
下面是我写的一个代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int a[10];
int i;
int n=4;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
// for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n");
/* while(next_permutation(a,a+n)){ //调用STL中的全排列函数
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}*/
do{
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}while(next_permutation(a,a+n));
return 0;
}
如果不实现排序,只会输出一部分排列。
另附源码:
template inline
bool next_permutation(_BidIt _First, _BidIt _Last)
{ // permute and test for pure ascending, using operator<
_BidIt _Next = _Last;
if (_First == _Last || _First == --_Next)
return (false);
for (; ; )
{ // find rightmost element smaller than successor
_BidIt _Next1 = _Next;
if (*--_Next < *_Next1)
{ // swap with rightmost element that's smaller, flip suffix
_BidIt _Mid = _Last;
for (; !(*_Next < *--_Mid); )
;
std::iter_swap(_Next, _Mid);
std::reverse(_Next1, _Last);
return (true);
}
if (_Next == _First)
{ // pure descending, flip all
std::reverse(_First, _Last);
return (false);
}
}
}