有时候,我们需要枚举一个数组中的所有组合,如从一个数组中取出n个元素的全部组合,这种算法想起来比较容易,做起来却不是那么简单。比如说从数组{1,2,3,4,5}中随机选出两个元素的组合有哪些,随机选出三个元素的组合又有哪些?
比如取三个元素的组合,我的思路是:
取1,2,然后再分别取3,4,5
取1,3,然后再分别取4,5
取1,4,然后取5
这样按照顺序来就可以保证没有重复,我们可以用递归来实现,先从数组中取出一个元素,再从余下的元素中取出一个元素,再从剩下的元素中取出一个元素,按照数组索引大小依次取,避免重复。程序清单如下:
package diguipailie;
/**
*
* @author Administrator
*/
public class Diguipailie {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int arr[] = {1, 2, 3, 4, 5, 6};
int num =3;
int []result=new int[num];
combine_increase(arr, 0, result, num, num, arr.length);
// return 0;
}
public static void combine_increase(int arr[], int start, int result[], int count, int NUM, int arr_len)
{
for (int i = start; i < arr_len + 1 - count; i++)
{
result[count - 1] = i;
if (count - 1 == 0)
{
int j;
for (j = NUM - 1; j >= 0; j--){
System.out.print(arr[result[j]]+"\t");
}
System.out.println("\n");
}
else
combine_increase(arr, i + 1, result, count - 1, NUM, arr_len);
}
}
}
其中arr为原始数组,start为遍历起始位置,result保存结果,为一维数组,num为要选取的元素个数,arr_len为数组长度,固定值,运行结果如下: