#include<stdio.h>
#include<algorithm>
#include<algorithm>
using namespace std;
int a[4]={1,2,3,4};
char b[4]={'a','b','c','d'};
int main(void){
sort(a,a+4); /*若是无序数列,用sort()排序*/
do{
for(int i=0;i<4;i++){
printf("%d ",a[i]);
}
printf("\n");
}while(next_permutation(a,a+4));
do{
for(int i=0;i<=4;i++){
printf("%c ",b[i]);
}
printf("\n");
}while(next_permutation(b,b+4));
return 0;
}
/*next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止,当整个序列为降序之后
next_permutation()会返回false
prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反*/
int a[4]={1,2,3,4};
char b[4]={'a','b','c','d'};
int main(void){
sort(a,a+4); /*若是无序数列,用sort()排序*/
do{
for(int i=0;i<4;i++){
printf("%d ",a[i]);
}
printf("\n");
}while(next_permutation(a,a+4));
do{
for(int i=0;i<=4;i++){
printf("%c ",b[i]);
}
printf("\n");
}while(next_permutation(b,b+4));
return 0;
}
/*next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止,当整个序列为降序之后
next_permutation()会返回false
prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反*/
算法思想:
1.首先从最尾端开始往前寻找两个相邻元素,令第一元素为*i,第二元素为*ii,且满足*i<*ii。
2.找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j,将i,j元素对调(swap)。
3.再将ii之后的所有元素颠倒(reverse)排序。
1.首先从最尾端开始往前寻找两个相邻元素,令第一元素为*i,第二元素为*ii,且满足*i<*ii。
2.找到这样一组相邻元素后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为*j,将i,j元素对调(swap)。
3.再将ii之后的所有元素颠倒(reverse)排序。
源代码:
template<calss BidrectionalIterator>
bool next_permutation(BidrectionalIterator first,BidrectionalIterator last)
{
if(first == lase) return false; /* 空区间 */
BidrectionalIterator i = first;
++i;
if(i == last) return false; /* 只有一个元素 */
i = last; /* i指向尾端 */
--i;
for(;;)
{
BidrectionalIterator ii = i;
--i;
/* 以上锁定一组(两个)相邻元素 */
if(*i < *ii) /* 如果前一个元素小于后一个元素 */
{
BidrectionalIterator j = last; /* 令j指向尾端 */
while(!(*i < *--j)); /* 由尾端往前找,直到遇到比*i大的元素 */
iter_swap(i,j); /* 交换i,j */
reverse(ii,last); /* 将ii之后的元素全部逆序重排 */
return true;
}
if(i == first) /* 进行至最前面了 */
{
reverse(first,last); /* 全部逆序重排 */
return false;
}
}
}
template<calss BidrectionalIterator>
bool next_permutation(BidrectionalIterator first,BidrectionalIterator last)
{
if(first == lase) return false; /* 空区间 */
BidrectionalIterator i = first;
++i;
if(i == last) return false; /* 只有一个元素 */
i = last; /* i指向尾端 */
--i;
for(;;)
{
BidrectionalIterator ii = i;
--i;
/* 以上锁定一组(两个)相邻元素 */
if(*i < *ii) /* 如果前一个元素小于后一个元素 */
{
BidrectionalIterator j = last; /* 令j指向尾端 */
while(!(*i < *--j)); /* 由尾端往前找,直到遇到比*i大的元素 */
iter_swap(i,j); /* 交换i,j */
reverse(ii,last); /* 将ii之后的元素全部逆序重排 */
return true;
}
if(i == first) /* 进行至最前面了 */
{
reverse(first,last); /* 全部逆序重排 */
return false;
}
}
}