#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找不到那样的组合了。