排列的字典序生成算法(自然解法)

本文介绍了一个使用Java实现的排列生成算法,该算法能够生成指定数组的所有下一个排列,并详细展示了如何通过扫描数组并找到关键元素来实现这一功能。文章还提供了完整的源代码示例。
import java.util.Arrays;
import java.util.Random;


public class permulationGenerator {

    
public static void main (String[] args) {
        
while(true)
        
{
            
            
//int n = Math.abs(new Random(10000).nextInt());
            
//int[] arr = itoarr(n);
            int[] arr = {8,5,4,6,1,7,9,2,3};
            
int[] nextArr = gen( arr );
            
for (int i=0; i<arr.length; i++)
            
{
                System.out.print( nextArr[i] );
            }
System.out.print(' ');
            System.out.flush();    
//force all output
        }

        
        
    }

    
/******************* version 1 *****************
    public int gen( int a[], int l )
    {
      int b[l];
      int i=l-1;
      
      int mark1;
      int mark2;
      
      memcpy( a, b, l );
      
      while( b[i-1] > b[i] )
        i--;
      //b[i-1]<b[i]
      mark1=i-1;      ///////////gold times ends
      i=l-1;//reset
      while( b[i] < b[mark1] )
        i--;
      //b[i]>b[mark1]
      mark2=i;
      swap( b[mark1], b[mark2] );
      reverse( b, mark1+1, l-1 );//////////////////////////bottleneck!!!!!!!!!!!
      System.out.println( b );
      return 0;
    }
    ******************* version 2 ****************
*/

    
public static int[] gen ( int[] a )
    
{
      
int[] b = new int[a.length];
      System.arraycopy(a, 
0, b, 0, a.length);

      
int mark1;
      
int mark2;
      
int i=b.length-1;    //scan up from right(low weight end)
      while (b[i-1> b[i] && i>1)//until 0==i-1
        i--;
      
//b[i-1]<b[i]>b[i+1]
      mark1=i-1;      ///////////////////////////gold times ends
      
      
//review history,jump to [i+1]
      while (i+1<b.length-1 && b[mark1] < b[i])//search maybe null !
      {
              i
++;
      }

      
//b[i-1]>b[mark1]>b[i]
      mark2= (mark1==i-1? i : i-1;
      swap (b, mark1, mark2);
      reverse( b, mark1
+1, b.length-1 );//////////////////////////bottleneck!!!!!!!!!!!
      return b;
    }

    
private static void reverse ( int[] b, int k, int j )
    
{
        
while( k<j )
        
{
            
int t = b[k];
            b[k] 
= b[j];
            b[j] 
= t;
            k
++;
            j
--;
        }

    }

    
private static void swap ( int x[], int a, int b ) {
        
int t = x[a];
        x[a] 
= x[b];
        x[b] 
= t;
        }

    
private static int[] itoarr ( int i )
    
{
        
int z=1;    //length of decimal,least 1
        int k=i;
        
for (; k/10>0; k = k/10)    
            z
++;
        
int[] a = new int[z];
        k
=i;
        
for (; z>0; z--, k=k/10)
            a[z
-1= k%10;    //index from 0=1(z)-1
        return a;
    }

}

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值