您的位置:首页 > 编程语言 > Java开发

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个时,说明当前序列是一个排列,输出。

四、递归的流程图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 递归 数据结构