#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;} 算法思路就是:1】从序列的末端开始,找到第一个相邻数组合,其中第一个数小于第二个数,比如:1 2 3 4,第一个组合是34,记录3的位置为i;2】从i位置之后的元素中,从末端开始找第一个大于它的数,就是4,交换这两个数;3】将i位置之后的数全部逆序,这样就生成了字典顺序的下一个序列;4】执行步骤1;结束的条件当然就是整个序列都逆序啦,就是步骤1找不到那样的组合了。