现在有一个数组1,2,3,4,5,要求从数组中选取3个元素对其进行排列组合。
基本思路就是,先组合,先从数组中选取出所有的组合情况,然后对这每一种组合进行排列。
代码如下:
package hello.ant;
public class Alog_PL_ZH {
public static void main(String[] args) {
int array[]={1,2,3,4,5};
//先组合,在排列
int n=3;
int result[]=new int[n];
ZH(array,result,0,0,n);
// PL(array, 0);
}
static void ZH(int[] array,int result[],int begin,int index,int length) {
if(length==0){
// for(int i=0;i<result.length;i++){
// System.out.print(result[i]);
// }
System.out.println();
PL(result, 0);
}else{
for(int i=begin;i<array.length;i++){
result[index]=array[i];
ZH(array,result,i+1,index+1,length-1);
}
}
}
static void PL(int result[],int index){
if(result.length==index){
for(int i=0;i<result.length;i++){
System.out.print(result[i]);
}
System.out.println();
}else{
for(int i=index;i<result.length;i++){
swap(result,i,index);
PL(result,index+1);
swap(result,i,index);
}
}
}
static void swap(int[] result, int i, int index) {
int temp=result[i];
result[i]=result[index];
result[index]=temp;
}
}
留下一个疑问,如果要求出所有的情况,比如说,组合情况还有1,2,3,4,5,12,13,14,15.......123,124,125....1234,1235......12345
这种情况下该怎么处理,难道就是简单的在上面的基础上,加上for循环,让result数组的长度从1变到5吗,这样的话,算法的执行效率不高吧。
程序代码如下:(暂时没有考虑执行效率)
package hello.ant;
public class Alog_PL_ZH2 {
public static void main(String[] args) {
first();
// PL(array, 0);
}
static void first(){
int array[]={1,2,3,4,5};
//先组合,在排列
int n=3;
int result[]=null;
for(int i=0;i<array.length;i++){
result=new int[i+1];//每次循环都改变result的长度,即意味着第一次是组合的是长度为1的,
// 这样就可以打印所有情况下的排列组合了。
ZH(array,result,0,0,result.length);
}
}
static void ZH(int[] array,int result[],int begin,int index,int length) {
if(length==0){
// for(int i=0;i<result.length;i++){
// System.out.print(result[i]);
// }
System.out.println();
PL(result, 0);
}else{
for(int i=begin;i<array.length;i++){
result[index]=array[i];
ZH(array,result,i+1,index+1,length-1);
}
}
}
static void PL(int result[],int index){
if(result.length==index){
for(int i=0;i<result.length;i++){
System.out.print(result[i]);
}
System.out.println();
}else{
for(int i=index;i<result.length;i++){
swap(result,i,index);
PL(result,index+1);
swap(result,i,index);
}
}
}
static void swap(int[] result, int i, int index) {
int temp=result[i];
result[i]=result[index];
result[index]=temp;
}
}
本文参考了这篇文章 http://blog.csdn.net/zmazon/article/details/8315418