递减进位制数法—全排列

package permutation;

import java.util.Scanner;

public class DeclinePermutation {

	public int factorial(int n) {
		int sum = 1;
		while (n > 1) {
			sum *= (n--);
		}
		return sum;
	}

	// get initialization permutation of scale is number
	public String creatPermutation(int number) {
		char[] ch = new char[number];
		for (int i = 1; i <= number; ++i)
			ch[i - 1] = (char) (i + 48);
		return String.valueOf(ch);
	}
	
	// get interNumber 0f original permutation number
	public String getInterNumber(String permutation) {
		char[] ch = permutation.toCharArray();
		char[] save = new char[permutation.length() - 1];
		for(int i = 0 ; i < permutation.length() ; ++i){
			//digit 1 has no interNumber
			if(ch[i]=='1') continue;
			//save is type of char 
			int count = 0 + 48;
			//count interNumber of the digit of position i
			for(int j = i + 1; j < permutation.length() ;++j ) {
				if(ch[i] > ch[j]) ++count;
			}
			//put count to the  array save in correspondence position
			save[ch[i] - 48 - 2] = (char)count;
		}
		return String.valueOf(save);
	}

	//find next permutation
	public String nextInterNumber(String interNumber) {
//		System.out.print("interNumber = " + interNumber + " + 1 = ");
		char[] ch = interNumber.toCharArray();
		for(int i = interNumber.length() - 1; i >= 0 ;--i){
			int pow = i + 2;
			ch[i] += 1;
//			System.out.println("ch[" + i + "] = " + ch[i]);
			if(ch[i] >= pow + 48) ch[i] -= pow;
			else break;
		}
//		System.out.println("ch = " + String.valueOf(ch));
//		System.out.println(String.valueOf(ch));
		return String.valueOf(ch);
	}
	
	// get permutation via a interNumber
	public String getPermutation(String interNumber) {
		char[] ch = interNumber.toCharArray();
		char[] npm = new char[interNumber.length() + 1];// new permutation number
		// initialization of npm
		for (int i = 0; i < interNumber.length() + 1; ++i)
			npm[i] = '0';// '0' represents space
		for (int i = interNumber.length() - 1; i >= -1; --i) {
			int digit = i + 2; // need to position
			// array index out of bound
			int count = 0;// make sure count = 0 while i = interNumber.length();
			if (i > -1) {
				count = (int) (ch[i] - 48);// char type to int type
//				System.out.println("count = " + count);
			}
			int j = interNumber.length();// from right to left traverse
			while (count > 0 && j > 0) {
				if (npm[j--] == '0') {
					--count;
				}
			}
			while (j >= 0) {
				if (npm[j] == '0') {
					npm[j] = (char) (digit + 48);// int to char
					break;
				}
				--j;
			}
		}
		return String.valueOf(npm);
	}
	
	public void declinePermutationAlgorathim(String permutation) {
		int time = 0;
		// control loop stop
		while ((++time) <= factorial(permutation.length())) {
			char[] ch = permutation.toCharArray();
			for(int i= 0 ; i< permutation.length() ; ++i){
				System.out.print(ch[i] + " ");
			}
			/** find next permutation */ 
			//original interNumber
			String original = getInterNumber(permutation);
			//next interNumbera
			String nextInterNumber = nextInterNumber(original);
			//update permutation with next permutation
			permutation = getPermutation(nextInterNumber);
			System.out.println("\t" + original);
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DeclinePermutation dp = new  DeclinePermutation ();
		String per  = "83674521";
		String curInt = dp.getInterNumber(per);
		for(int j = 0 ; j < 1013 ; ++ j){
			curInt = dp.nextInterNumber(curInt);
		}
		System.out.println("curInt = " + curInt);
		 per =dp.getPermutation(curInt);
		 System.out.println("per = " + per);
//		System.out.println(dp.getInterNumber("839647521"));
//		System.out.println(dp.nextInterNumber(dp.getInterNumber("839647521")));
//		System.out.println(dp.getPermutation("12224400"));
//		System.out.println(dp.getPermutation("12224401"));
//		System.out.println(dp.nextInterNumber("0004"));
		Scanner scan = new Scanner(System.in);
		System.out.println("Please input scale of permutation: ");
		int scale = scan.nextInt();
		long start = System.currentTimeMillis();
		dp.declinePermutationAlgorathim(dp.creatPermutation(scale));
		long end = System.currentTimeMillis();
		System.out.println("Run time : " + (double)Math.round(end - start)/1000 + "second");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值