排列组合的常见方法有递归,字典序等等,递归在此不列出来了,就把字典序的代码贴一下,算法思想不懂谷歌。
package practice;
import java.util.Arrays;
public class ZuheDic {
public static void main(String[] args) {
int[] a = new int[]{0,1,2,3,4,5,6,7,8,9};
int n=9;
int index=0,i,c=1;
while((index=hasSeq(a,n))!=0){
for(i=1;i<=n;i++){
System.out.print(a[i]+" ");
}
System.out.println();
for(i=n;i>index;i--){
if(a[i]>a[index]){
break;
}
}
swap(a,i,index);
Arrays.sort(a, index+1, n+1);
c++;
}
for(i=1;i<=n;i++){
System.out.print(a[i]+" ");
}
System.out.println();
System.out.println(c);
}
private static void swap(int[] a, int i, int j) {
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
private static int hasSeq(int[] a, int n) {
for(int i=n;i>1;i--){
if(a[i]>a[i-1]){
return i-1;
}
}
return 0;
}
}
下面介绍另外一种思想:
开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没有选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数;然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端;当第一个“1”移动到数组的m-n位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
例如求5中选3的组合:
1 1 1 0 0 //1, 2, 3
1 1 0 1 0 //1, 2, 4
1 0 1 1 0 //1, 3, 4
0 1 1 1 0 //2, 3, 4
1 1 0 0 1 //1, 2, 5
1 0 1 0 1 //1, 3, 5
0 1 1 0 1 //2, 3, 5
1 0 0 1 1 //1, 4, 5
0 1 0 1 1 //2, 4, 5
0 0 1 1 1 //3, 4, 5
package practice;
import java.util.Arrays;
import java.util.Scanner;
public class Zuhe {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[n+1];
Arrays.fill(a, 0);
for(int i=1;i<=m;i++){
a[i]=1;
}
int index=0;
while((index=hasNext(a,n))!=0){
for(int i=1;i<=n;i++){
if(a[i]==1){
System.out.print(i+" ");
}
}
System.out.println();
for(int i=2;i<index;i++){
if(a[i]>a[i-1]){
swap(a,i,i-1);
}
}
swap(a,index,index+1);
}
for(int i=1;i<=n;i++){
if(a[i]==1){
System.out.print(i+" ");
}
}
}
private static int hasNext(int[] a,int n) {
for(int i=2;i<=n;i++){
if(a[i]==0&&a[i-1]==1){
return i-1;
}
}
return 0;
}
private static void swap(int[] a,int i,int j){
int temp = a[i];
a[i]=a[j];
a[j]=temp;
}
}
2256

被折叠的 条评论
为什么被折叠?



