abcde全排序java,abcde全排列及改进

思路

1.将第一个元素和第i个元素交换,然后求剩余n-1个元素的全排列

2.还原交换的数据,再求下一轮全排列

代码

public class Test3 {

public static int count = 0;

public static void main(String [] args){

Test3.rank();

System.out.println("总共有"+count+"次排列");

}

public static void rank(){

char[] letterArray = {'a','b','c','d','e'};

for(int c1=0;c1<5;c1++){ //0 - 4

swap(letterArray,0,c1);

for(int c2=1;c2<5;c2++){ //0 - 3

swap(letterArray,1,c2);

for(int c3=2;c3<5;c3++){ //0 - 2

swap(letterArray,2,c3);

for(int c4=3;c4<5;c4++){ // 0 - 1

swap(letterArray,3,c4);

for(int c5=4;c5<5;c5++){

print(letterArray);

Test3.count++;

}

swap(letterArray,c4,3);

}

print(letterArray);

swap(letterArray,c3,2);

}

swap(letterArray,c2,1);

}

swap(letterArray,c1,0);

}

}

public static void swap(char[] letterArray,int first,int second){

if(first == second){

return;

}

char middel = 'z';

middel = letterArray[first];

letterArray[first] = letterArray[second];

letterArray[second]=middel;

}

public static void print(char[] letterArray){

StringBuilder sb = new StringBuilder();

sb.append("第"+count+"次排列是:");

for(int i=0;i

if(i==letterArray.length-1){

sb.append(letterArray[i]);

}else{

sb.append(letterArray[i]).append(",");

}

}

System.out.println(sb.toString());

}

}

改进点

五层for循环是不合理的,超过3就应当考虑使用循环

数组生成可以优化

改进后的代码

import java.util.Scanner;

public class Test3 {

public static int count = 0;

public static void main(String [] args){

//确定要对多少个字母列举全排列

Scanner scanner = new Scanner(System.in);

System.out.println("从a开始,要做多少个字母的全排列?");

int amount = scanner.nextInt();

//给将这些字母放在数组里面

char[] letterArray = new char[amount];

for(int i=0;i

letterArray[i]=(char)('a'+i);

}

//进行全排列计算

Test3.order(letterArray,0,amount);

System.out.println("总共有"+count+"次排列");

}

/**

* 递归调用

* @param letterArray

* @param num

* @param amount

*/

public static void order(char[] letterArray,int num,int amount){

if(num == amount-1){

print(letterArray);

Test3.count++;

}else{

for(int i=num;i

swap(letterArray,num,i);

order(letterArray,num+1,amount);

swap(letterArray,i,num);

}

}

}

/**

* 交换方法

* @param letterArray

* @param first

* @param second

*/

public static void swap(char[] letterArray,int first,int second){

if(first == second){

return;

}

char middel = 'z';

middel = letterArray[first];

letterArray[first] = letterArray[second];

letterArray[second]=middel;

}

/**

* 打印方法

* @param letterArray

*/

public static void print(char[] letterArray){

StringBuilder sb = new StringBuilder();

sb.append("第"+count+"次排列是:");

for(int i=0;i

if(i==letterArray.length-1){

sb.append(letterArray[i]);

}else{

sb.append(letterArray[i]).append(",");

}

}

System.out.println(sb.toString());

}

}

结果:

2f68162070b5?from=timeline

Paste_Image.png

2f68162070b5?from=timeline

Paste_Image.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值