#include
<
iostream
>
#include < iterator >
#include < tchar.h >
using namespace std;
int array[] = {1,2,3,4} ;
int _tmain( int argc, char * argv[])
{
int *const end=array+sizeof(array)/sizeof(*array);
int *p=NULL;
do{
copy(array,end,ostream_iterator<int>(cout));
cout<<' ';
for(p=end-1;p!=array;--p){
if(*p>*(p-1)){
for(int *p2=end-1;p2!=p-1;--p2){
if(*p2>*(p-1)){
swap(*p2,*(p-1));
reverse(p,end);
break;
}
}
break;
}
}
if(p==array)
break;
}while(true);
system("pause");
return 0;
}
#include < iterator >
#include < tchar.h >
using namespace std;
int array[] = {1,2,3,4} ;
int _tmain( int argc, char * argv[])
{
int *const end=array+sizeof(array)/sizeof(*array);
int *p=NULL;
do{
copy(array,end,ostream_iterator<int>(cout));
cout<<' ';
for(p=end-1;p!=array;--p){
if(*p>*(p-1)){
for(int *p2=end-1;p2!=p-1;--p2){
if(*p2>*(p-1)){
swap(*p2,*(p-1));
reverse(p,end);
break;
}
}
break;
}
}
if(p==array)
break;
}while(true);
system("pause");
return 0;
}
算法思路就是:
1】从序列的末端开始,找到第一个相邻数组合,其中第一个数小于第二个数,比如:1 2 3 4,第一个组合是34,记录3的位置为i;
2】从i位置之后的元素中,从末端开始找第一个大于它的数,就是4,交换这两个数;
3】将i位置之后的数全部逆序,这样就生成了字典顺序的下一个序列;
4】执行步骤1;
结束的条件当然就是整个序列都逆序啦,就是步骤1找不到那样的组合了。