思路

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());

}

}

结果:

Paste_Image.png

Paste_Image.png

abcde全排序java,abcde全排列及改进相关推荐

  1. java递归实现数组逆序_Java实现数组全排序(递归)

    冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下:(从后往 ...

  2. java 数据排序需求分析_java 实现数组全排序

    什么是全排序? 所谓的数组全排序也就是将数组中的元素的所有排列组合全部列出来 比如 数组 char[] data = {'a', 'b', 'c', 'd'}; 那么就需要将 abcd, acbd, ...

  3. 史上最全阿里 Java 面试题总结及答案

    史上最全阿里 Java 面试题总结及答案 qq_35151346 于 2019-08-06 13:26:53 发布 33740 收藏 817 分类专栏: 面试题 文章标签: 阿里巴巴 面试题 答案 j ...

  4. 最全面的Java面试题-----是你更好的掌握java知识

    最全面的Java面试题-----是你更好的掌握java知识 目录 l     概念题--- 1 一.        JAVA基础--- 1 1)      面向对象的特征--- 1 2)      什 ...

  5. WritableComparable排序案例(全排序)

    WritableComparable排序案例(全排序) 需求 1. 需求说明 2. 文件 案例分析 1. 需求分析 2. 输入数据 3. 期望输出数据 4. FlowBean类 5. Mapper类 ...

  6. java redis remove_最全的Java操作Redis的工具类

    RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...

  7. 推荐:全网最全的Java并发面试题及答案。

    转载自  推荐:全网最全的Java并发面试题及答案. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程 ...

  8. 二分排序java实现

    1.什么是二分排序: 二分排序是指利用二分法的思想对插入排序进行改进的一种插入排序算法,不同于二叉排序,可以利用数组的特点快速定位指定索引的元素: 算法思想:二分法插入排序是在插入第i个元素时,对前面 ...

  9. Hadoop MR 分区(partition)和全排序(WritableComparable)

    一.概念 1.分区: Hadoop默认分区是根据key的hashCode对ReduceTask个数取模得到的,用户无法控制哪个key存储到哪个分区.想要控制哪个key存储到哪个分区,需要自定义类继承P ...

最新文章

  1. 精品思维导图,流程图模板分享
  2. Prepared statements(mysqli pdo)
  3. mysql语句二级查询_mysql_2 基本查询语句
  4. 4G通信技术LTE介绍
  5. Document、HTMLDocument关系的探究
  6. DotNetTextBox编辑器
  7. bc -- The Linux Command-line Calculator
  8. 数据结构经典案例_计算机领域必读的经典书籍清单
  9. deebot地面清洁机器人怎么关_买扫地机器人还是吸尘器?看完你就明白了
  10. 2008-03-17 淋湿的心情
  11. 20200102每日一句
  12. npm init @vitejs/app 到底干了什么
  13. PHP100视频解压密码以及目录
  14. matlab遗传算法超出,matlab遗传算法提示索引超出范围
  15. 李炎恢php视频教程ed2k,李炎恢PHP视频教程第一二三四季,含源码和教课文档从入门到精通...
  16. python计算峰度和偏度、相关系数
  17. Go语言 windows环境安装
  18. python3.8安装cartopy使用报错:DLL load failed while importing trace
  19. 2018 蓝桥杯省赛 A 组模拟赛(一) 青出于蓝胜于蓝
  20. 计算机无法加载加密文件,win10电脑加密,win10加密文件无法解密

热门文章

  1. Java布尔类型变量命名与类型问题
  2. svn 远程分支改名字了, 本地分支如何进行同步
  3. win7计算机管理无用户账户,win7用户账户控制怎么取消
  4. 生成mbn以及ap测编译mbn
  5. Flink实战问题(一):Unable to create a sink for writing table
  6. rust黑球_黑球——桌面重力,开局就是地狱模式的游戏你玩过没?
  7. Rockchip rk3588 U-Boot详解 (一)
  8. TCPIP网络基础知识
  9. 博弈论学习笔记(二)学会换位思考
  10. redis可视化工具 redisisInsight