Java-全排列-递归 详解
2016-08-22 10:38
183 查看
一、比如对1 2 3 全排列:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
以递归的思想来看:
1. 对于0号位置元素,分别是1 2 3;
实现方法:将原有的0号元素分别于0,1,2号元素交换。
2. 除0号位置元素外,对剩下的子序列进行全排列, 按照1,2步骤进行。
4. 当子序列只有个一元素,即要固定的位置等于序列最后一个元素小标时,打印输出整个序列。
{1} 2 3(1和1交换)
{1}{2}3(2和2交换)
print 1 2 3
{1}{3}2(2和3交换)
print 1 3 2
{2} 1 3 (1和2交换)
{2}{1}3 (1和1交换)
print 2 1 3
{2}{3}1 (1和3交换)
print 2 3 1
{3} 2 1(1和3交换)
{3}{2}1(2和2交换)
print 3 2 1
{3}{1}2(2和1交换)
print 3 1 2
二、 递归代码:
public class AllSort {
public static void main(String[] args) {
int buf[] = {1,2,3};
perm(buf, 0, buf.length - 1);
}
public static void perm(int[] buf, int start, int end) {
// 只对数组中一个元素全排列时,只要就按该数组输出即可
if (start == end) {
printString(buf);
} else { // 多个字母全排列
for (int i = start; i <= end; i++) {
swap(buf,start,i); // 交换数组第一个元素与后续的元素
perm(buf, start + 1, end);// 后续元素递归全排列
swap(buf,start,i);// 将交换后的数组还原
}
}
}
static void swap(int buf[],int idx1,int idx2){
int temp = buf[idx1];
buf[idx1] = buf[idx2];
buf[idx2] = temp;
}
static void printString(int list[]){
for (int i = 0; i < list.length; i++) {
System.out.print(list[i]);
}
System.out.println();
}
}
三、 递归程序分为三步骤:
1.遍历交换start(可视为0号位置)与后续每个元素,作为固定元素;
2. 对固定位置外的元素进行全排列
3. 恢复交换,恢复到原始数列,重复1,2
4. 当要进行全排列元素只有1个时,说明当前序列是一个排列,输出。
四、递归的流程图:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
以递归的思想来看:
1. 对于0号位置元素,分别是1 2 3;
实现方法:将原有的0号元素分别于0,1,2号元素交换。
2. 除0号位置元素外,对剩下的子序列进行全排列, 按照1,2步骤进行。
4. 当子序列只有个一元素,即要固定的位置等于序列最后一个元素小标时,打印输出整个序列。
{1} 2 3(1和1交换)
{1}{2}3(2和2交换)
print 1 2 3
{1}{3}2(2和3交换)
print 1 3 2
{2} 1 3 (1和2交换)
{2}{1}3 (1和1交换)
print 2 1 3
{2}{3}1 (1和3交换)
print 2 3 1
{3} 2 1(1和3交换)
{3}{2}1(2和2交换)
print 3 2 1
{3}{1}2(2和1交换)
print 3 1 2
二、 递归代码:
public class AllSort {
public static void main(String[] args) {
int buf[] = {1,2,3};
perm(buf, 0, buf.length - 1);
}
public static void perm(int[] buf, int start, int end) {
// 只对数组中一个元素全排列时,只要就按该数组输出即可
if (start == end) {
printString(buf);
} else { // 多个字母全排列
for (int i = start; i <= end; i++) {
swap(buf,start,i); // 交换数组第一个元素与后续的元素
perm(buf, start + 1, end);// 后续元素递归全排列
swap(buf,start,i);// 将交换后的数组还原
}
}
}
static void swap(int buf[],int idx1,int idx2){
int temp = buf[idx1];
buf[idx1] = buf[idx2];
buf[idx2] = temp;
}
static void printString(int list[]){
for (int i = 0; i < list.length; i++) {
System.out.print(list[i]);
}
System.out.println();
}
}
三、 递归程序分为三步骤:
1.遍历交换start(可视为0号位置)与后续每个元素,作为固定元素;
2. 对固定位置外的元素进行全排列
3. 恢复交换,恢复到原始数列,重复1,2
4. 当要进行全排列元素只有1个时,说明当前序列是一个排列,输出。
四、递归的流程图:
相关文章推荐
- java 递归详解
- java 全排列 递归实现
- 用递归实现排列组合(java代码)
- 通过递归判断一个整形数组是否按升序排列(java实现)
- leetcode 77. Combinations-排列|递归|非递归|Java|Python
- 递归的使用——关于括号排列(分别使用Java和C++算法实现)
- 用递归求数组全排列(java)
- 排列的Java递归语言实现
- 递归:全排列的java实现
- Java递归实现字符串全排列
- Java 非递归实现的排列组合中的平均分组问题
- java 排列组合(递归实现)
- 排列与组合的Java递归实现 (参考)
- 全排列的递归实现(java代码)
- Java递归实现全排列改进(二)---利用ArrayList实现去重
- 排列与组合的Java递归实现
- Java排列组合之递归调用
- 排列与组合的Java递归实现 (参考)
- JAVA递归全排列
- Java中的迭代和递归详解