首页 > 代码库 > [不明觉厉] 下一个排列

[不明觉厉] 下一个排列

函数实现原理如下:

在当前序列中,从尾端往前寻找两个相邻元素,前一个记为*i,后一个记为*ii,并且满足*i < *ii。然后再从尾端寻找另一个元素*j,如果满足*i < *j,即将第i个元素与第j个元素对调,并将第ii个元素之后(包括ii)的所有元素颠倒排序,即求出下一个序列了。

//http://blog.csdn.net/morewindows/article/details/7370155/public class Solution {    public void swap(int a[],int i,int j)    {        int temp=a[i];        a[i]=a[j];        a[j]=temp;    }    public void reverse(int a[],int i,int j)    {        int m=i;        int n=j;        while(m<n)        {            swap(a,m,n);            m++;n--;        }    }                            public void nextPermutation(int[] num) {              int len=num.length;        int i;        for( i=len-2;i>=0;i--)        {            if(num[i]<num[i+1]) break;        }        int p=i;                if(p<0){ reverse(num,0,len-1);return;}                for(i=len-1;i>=0;i--)        {            if(num[i]>num[p]) break;        }        int q=i;        swap(num,p,q);                reverse(num,p+1,len-1);                                                                }        }