下一排列组合的算法

用类似于Bubble sort排序,先检查相邻的两个元素,如果前一个*i与比后一个*ii小,可以交换调整。 next_permutation从最后一个元素开始,找到一个大于*i的元素(该元素可能比*ii还小),将该元素与*i交换,最后反转排列*ii后的元素。

 

#include <iostream> using namespace std; //测试代码 //输出结果125734689 int main() { int d[]={1,2,5,6,9,8,7,4,3}; if(nextpermutation(d,d+9)) { for(int i=0;i<9;i++) cout<<d[i]; cout<<endl; } return 0; } void swap(int* x,int* y) { int temp; temp=*x; *x=*y; *y=temp; } void reverse(int *first,int *last) { --last; for(;first<last;first++,last--) swap(first,last); } bool nextpermutation(int* first,int* last) { if(first==last) return false; //为空 if(first+1==last) return false; //只有一个元素 int* i=last; --i; for(;;){ int* ii=i; --i;//前后一对 if(*i<*ii){ //前<后,相邻 int* j=last; while(!(*i<*--j)); swap(i,j); //交换*i,*j reverse(ii,last); //反向排列[ii,last) return true; } if(i==first){//前一元素已指向首元素,反转整个区间,无下一排列 reverse(first,last); return false; } } }

 

这里用的是int*指针,可以写成模板,对char的字符数组也能返回下一排列组合。这里参考了STL的next_permutation算法.

产生前一排列组合也可以用类似的想法。

你可能感兴趣的:(下一排列组合的算法)