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());
}
}
结果:
Paste_Image.png
Paste_Image.png
abcde全排序java,abcde全排列及改进相关推荐
- java递归实现数组逆序_Java实现数组全排序(递归)
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下:(从后往 ...
- java 数据排序需求分析_java 实现数组全排序
什么是全排序? 所谓的数组全排序也就是将数组中的元素的所有排列组合全部列出来 比如 数组 char[] data = {'a', 'b', 'c', 'd'}; 那么就需要将 abcd, acbd, ...
- 史上最全阿里 Java 面试题总结及答案
史上最全阿里 Java 面试题总结及答案 qq_35151346 于 2019-08-06 13:26:53 发布 33740 收藏 817 分类专栏: 面试题 文章标签: 阿里巴巴 面试题 答案 j ...
- 最全面的Java面试题-----是你更好的掌握java知识
最全面的Java面试题-----是你更好的掌握java知识 目录 l 概念题--- 1 一. JAVA基础--- 1 1) 面向对象的特征--- 1 2) 什 ...
- WritableComparable排序案例(全排序)
WritableComparable排序案例(全排序) 需求 1. 需求说明 2. 文件 案例分析 1. 需求分析 2. 输入数据 3. 期望输出数据 4. FlowBean类 5. Mapper类 ...
- java redis remove_最全的Java操作Redis的工具类
RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...
- 推荐:全网最全的Java并发面试题及答案。
转载自 推荐:全网最全的Java并发面试题及答案. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程 ...
- 二分排序java实现
1.什么是二分排序: 二分排序是指利用二分法的思想对插入排序进行改进的一种插入排序算法,不同于二叉排序,可以利用数组的特点快速定位指定索引的元素: 算法思想:二分法插入排序是在插入第i个元素时,对前面 ...
- Hadoop MR 分区(partition)和全排序(WritableComparable)
一.概念 1.分区: Hadoop默认分区是根据key的hashCode对ReduceTask个数取模得到的,用户无法控制哪个key存储到哪个分区.想要控制哪个key存储到哪个分区,需要自定义类继承P ...
最新文章
- 精品思维导图,流程图模板分享
- Prepared statements(mysqli pdo)
- mysql语句二级查询_mysql_2 基本查询语句
- 4G通信技术LTE介绍
- Document、HTMLDocument关系的探究
- DotNetTextBox编辑器
- bc -- The Linux Command-line Calculator
- 数据结构经典案例_计算机领域必读的经典书籍清单
- deebot地面清洁机器人怎么关_买扫地机器人还是吸尘器?看完你就明白了
- 2008-03-17 淋湿的心情
- 20200102每日一句
- npm init @vitejs/app 到底干了什么
- PHP100视频解压密码以及目录
- matlab遗传算法超出,matlab遗传算法提示索引超出范围
- 李炎恢php视频教程ed2k,李炎恢PHP视频教程第一二三四季,含源码和教课文档从入门到精通...
- python计算峰度和偏度、相关系数
- Go语言 windows环境安装
- python3.8安装cartopy使用报错:DLL load failed while importing trace
- 2018 蓝桥杯省赛 A 组模拟赛(一) 青出于蓝胜于蓝
- 计算机无法加载加密文件,win10电脑加密,win10加密文件无法解密