- packageBeanUtil;
- importjava.util.ArrayList;
- importjava.util.List;
- importcom.work.core.exception.OurException;
- /**
- *统计任三出现的最多的几率的组合
- *
- *@authorwangmingjie
- *@date2009-1-1下午01:22:19
- */
- publicclassCopy_2_of_StatisAnyThree{
- //组合算法
- //本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
- //代表的数被选中,为0则没选中。
- //首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
- //然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为
- //“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
- //当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得
- //到了最后一个组合。
- //例如求5中选3的组合:
- //11100//1,2,3
- //11010//1,2,4
- //10110//1,3,4
- //01110//2,3,4
- //11001//1,2,5
- //10101//1,3,5
- //01101//2,3,5
- //10011//1,4,5
- //01011//2,4,5
- //00111//3,4,5
- publicstaticvoidmain(String[]args){
- Copy_2_of_StatisAnyThrees=newCopy_2_of_StatisAnyThree();
- s.printAnyThree();
- }
- /**
- *
- */
- publicvoidprintAnyThree(){
- int[]num=newint[]{1,2,3,4,5,6};
- print(combine(num,3));
- }
- /**
- *从n个数字中选择m个数字
- *@parama
- *@paramm
- *@return
- */
- publicListcombine(int[]a,intm){
- intn=a.length;
- if(m>n){
- thrownewOurException("错误!数组a中只有"+n+"个元素。"+m+"大于"+2+"!!!");
- }
- Listresult=newArrayList();
- int[]bs=newint[n];
- for(inti=0;i<n;i++){
- bs[i]=0;
- }
- //初始化
- for(inti=0;i<m;i++){
- bs[i]=1;
- }
- booleanflag=true;
- booleantempFlag=false;
- intpos=0;
- intsum=0;
- //首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
- do{
- sum=0;
- pos=0;
- tempFlag=true;
- result.add(print(bs,a,m));
- for(inti=0;i<n-1;i++){
- if(bs[i]==1&&bs[i+1]==0){
- bs[i]=0;
- bs[i+1]=1;
- pos=i;
- break;
- }
- }
- //将左边的1全部移动到数组的最左边
- for(inti=0;i<pos;i++){
- if(bs[i]==1){
- sum++;
- }
- }
- for(inti=0;i<pos;i++){
- if(i<sum){
- bs[i]=1;
- }else{
- bs[i]=0;
- }
- }
- //检查是否所有的1都移动到了最右边
- for(inti=n-m;i<n;i++){
- if(bs[i]==0){
- tempFlag=false;
- break;
- }
- }
- if(tempFlag==false){
- flag=true;
- }else{
- flag=false;
- }
- }while(flag);
- result.add(print(bs,a,m));
- returnresult;
- }
- privateint[]print(int[]bs,int[]a,intm){
- int[]result=newint[m];
- intpos=0;
- for(inti=0;i<bs.length;i++){
- if(bs[i]==1){
- result[pos]=a[i];
- pos++;
- }
- }
- returnresult;
- }
- privatevoidprint(Listl){
- for(inti=0;i<l.size();i++){
- int[]a=(int[])l.get(i);
- for(intj=0;j<a.length;j++){
- System.out.print(a[j]+"\t");
- }
- System.out.println();
- }
- }
- }
高效率的排列组合算法(java实现)
最新推荐文章于 2022-03-19 15:47:38 发布