下一个排列 字典序 Java

深入理解 JVM 原理
深入理解 JVM 原理
wangxiaoming

                                            全排列

字典序的思想:
            按照字典序的思想  产生所以 全排列 : 例如 P = p0p1p2p3p4p5p6p7p8...pn 按照字典序生成排列的方法
     1) 从右到左 计算 最后一个正序的下标 i  i = max{ j | pj-1 < pj , pj >= pj+1}
      2) 从pi-1 的后面  比找到字典序比 Pi-1大的最后一个坐标 j   j = max {k  | k >i ; p i -1  < pk , pi-1 > pk+1}
      3) 互相交换  pi- 1和 pj  的的得到 p0  ...pi-2   pj  pi  pi+1...  pj -1 pi-1 pj+1 ....pn;
      4)  反排 i-1 后面的数 使其递增进行得到 p0  ...pi-2 pn ...pj+1 pi-1 pj-1...pi+1 pi 
 
 下面举个栗子 :
              P = 2763541 
              1) 2  7 6 3 5 4 1   找到 i= 3; 即是3 这个数
               2)2 7 6 3 5 4 1  找到 j = 5 即使 4 这个数
               3)2 7 6 4 5 3 1   交换着两个数
               4)2 7 6 4 1 3 5  把 i -1 后面的数进行逆序
源代码:
import java.util.*;
import java.io.*;
public class 全排列 {

	/**
	 * @param args
	 */
	//面向对象 首先是类 ,然后再是类里面有什么函数
	//申明一个交换函数
	private  static  void swap(int[] arr, int i , int j ) 
	{
		 int tmp = arr[i] ;
		 arr[i] = arr[j] ;
		 arr[j] = tmp;
	}
	//线面建立一个下一个排列的函数
    static boolean next_permutation(int[] arr)
	{//非递归形式实现全排列
    	//也就是采用字典序进行排列
		int n = arr.length;
		int  i = n -1 ;
		while( i > 0 && arr[i -1] > arr[i] )
			i--;
		if(i <= 0) return  false ;
		int cnt = i;   //用cnt 来标记找到的位置
		int j ;
		for(j = i + 1; j < n ; j++)
		{
			if(arr[j] <= arr[j-1] ) continue ;
			if(arr[j] < arr[cnt]) cnt = j ;
		}
		swap(arr, i-1 , cnt);
		//下面进行排序将i 到 n - 1段 排成正序 两两交换即可
		//因为已经是逆序来 所以只要前后交换一下就可以变成正序
		for(int k = 0 ; k <(n - i)/2; k++)
		{
			swap(arr, i+k+1, n-k-1);
		}
		return true;	
	}
    public  static void print_Str(int[] arr)
    {
    	 for(int i = 0 ; i < arr.length-1; i++)
    	 {
    		 System.out.print(arr[i]+" ");
    	 }
    	 System.out.println(arr[arr.length-1]);
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
	    int[] arr = {1,2,3};
	    print_Str(arr);
	    while(next_permutation(arr))
	    {
	    	print_Str(arr);
	    }		
	}

}
 
结果 其实结果这里是不完全的 :。。。。
 
1 2 3
1 3 2
3 1 2
3 2 1


 
   
 
wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值