[不明觉厉] 下一个排列

函数实现原理如下:

在当前序列中,从尾端往前寻找两个相邻元素,前一个记为*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);
            
        
        
        
        
            
        }
        
}
原文地址:https://www.cnblogs.com/hansongjiang/p/3863088.html