该算法还是比较简单的。一共分为三步,即:1. 找位置;2. 交换;3. 倒序。下面结合具体例子{3,7,9,8,6,2}来进行说明。
1. 找位置。从末尾开始往前找到第一个降序的位置。如上述例子中,第一个降序的位置为1,值为7。再从该位置的后面部分找到从后往前找到第一个比该值大的数,即8,位置为3.
2. 交换。对上述找到的位置的值进行交换。序列变成了{3,8,9,7,6,2}。
3. 倒序。对第一个降序位置后面的部分进行倒序,即把{9,7,6,2}倒序为{2,6,7,9}。
代码如下:
class Solution { public: void nextPermutation(vector<int> &num) { int p,q,i,t=0; int guard; int N=num.size(); if(num.size()<2) return; p=N-1; while(p>0&&num[p-1]>=num[p]) { p--; } p--; if(p>=0) { for(i=N-1;i>p;i--) { if(num[i]>num[p]) { break; } } t=num[p]; num[p]=num[i]; num[i]=t; } p=p+1; q=N-1; while(p<q) { t=num[p]; num[p]=num[q]; num[q]=t; p++;q--; } } };