关于各种排列组合java算法实现方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于各种排列组合java算法实现方法相关的知识,希望对你有一定的参考价值。

参考技术A

  一 利用二进制状态法求排列组合 此种方法比较容易懂 但是运行效率不高 小数据排列组合可以使用

复制代码 代码如下: import java util Arrays;

  //利用二进制算法进行全排列 //count : //count :

  public class test public static void main(String[] args) long start=System currentTimeMillis(); count (); long end=System currentTimeMillis(); System out println(end start); private static void count () int[] num=new int [] ; for(int i= ;i<Math pow( );i++) String str=Integer toString(i ); int sz=str length(); for(int j= ;j< sz;j++) str=" "+str; char[] temp=str toCharArray(); Arrays sort(temp); String gl=new String(temp); if(!gl equals(" ")) continue; String result=""; for(int m= ;m<str length();m++) result+=num[Integer parseInt(str charAt(m)+"")]; System out println(result); public static void count () int[] num=new int [] ; int[] ss=new int [] ; int[] temp=new int[ ]; while(temp[ ]< ) temp[temp length ]++; for(int i=temp length ;i> ;i ) if(temp[i]== ) temp[i]= ; temp[i ]++; int []tt=temp clone(); Arrays sort(tt); if(!Arrays equals(tt ss)) continue; String result=""; for(int i= ;i<num length;i++) result+=num[temp[i]]; System out println(result);

   二 用递归的思想来求排列跟组合 代码量比较大

复制代码 代码如下: package practice;

  import java util ArrayList; import java util List;

   public class Test

  /** * @param args */ public static void main(String[] args) // TODO Auto generated method stub Object[] tmp= ; // ArrayList<Object[]> rs=RandomC(tmp); ArrayList<Object[]> rs=cmn(tmp ); for(int i= ;i<rs size();i++) // System out print(i+"="); for(int j= ;j<rs get(i) length;j++) System out print(rs get(i)[j]+" "); System out println();

   // 求一个数组的任意组合 static ArrayList<Object[]> RandomC(Object[] source) ArrayList<Object[]> result=new ArrayList<Object[]>(); if(source length== ) result add(source); else Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) psource[i]=source[i]; result=RandomC(psource); int len=result size();//fn组合的长度 result add((new Object[]source[source length ])); for(int i= ;i<len;i++) Object[] tmp=new Object[result get(i) length+ ]; for(int j= ;j<tmp length ;j++) tmp[j]=result get(i)[j]; tmp[tmp length ]=source[source length ]; result add(tmp); return result; static ArrayList<Object[]> cmn(Object[] source int n) ArrayList<Object[]> result=new ArrayList<Object[]>(); if(n== ) for(int i= ;i<source length;i++) result add(new Object[]source[i]); else if(source length==n) result add(source); else Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) psource[i]=source[i]; result=cmn(psource n); ArrayList<Object[]> tmp=cmn(psource n ); for(int i= ;i<tmp size();i++) Object[] rs=new Object[n]; for(int j= ;j<n ;j++) rs[j]=tmp get(i)[j]; rs[n ]=source[source length ]; result add(rs); return result;

  

   三 利用动态规划的思想求排列和组合

复制代码 代码如下: package Acm; //强大的求组合数 public class MainApp public static void main(String[] args) int[] num=new int[] ; String str=""; //求 个数的组合个数 // count( str num ); // 求 n个数的组合个数 count ( str num);

  private static void count (int i String str int[] num) if(i==num length) System out println(str); return; count (i+ str num); count (i+ str+num[i]+" " num);

  private static void count(int i String str int[] num int n) if(n== ) System out println(str); return; if(i==num length) return; count(i+ str+num[i]+" " num n ); count(i+ str num n);

   下面是求排列

复制代码 代码如下: lishixinzhi/Article/program/Java/JSP/201311/20148

java字母和数字排列组合后

要求0-9、a-z、A-Z一共62个数字和字母排列出所有的可能。例如:0、1、2、3、....0a、.....、012、.....

组合排列问题,用递归思想

1 选出组合

2 全排列(递归)

import java.util.ArrayList;
import java.util.List;

public class AllSort 
    /**
     * 从数组中选出所有组合
     * @param source
     * @param arrayList
     * @param num
     */
    public static void select(char[] source, List<String> arrayList, int num) 
        int lg = source.length;
        char[] temp = new char[num];
        System.arraycopy(source, 0, temp, 0, num);
        // 首次填充数组
        arrayList.add(new String(temp));
        // 逐个(位置)替换方式实现不重复全选
        for (int i = num; i < lg; i++) 
            for (int j = 0; j < num; j++) 
                char tempChar = temp[j];
                temp[j] = source[i];
                arrayList.add(new String(temp));
                temp[j] = tempChar;
            
        
    

    /**
     * 全排序
     * @param source
     * @param start
     * @param end
     */
    public static void perm(char[] source, int start, int end) 
        if (start == end) // 递归出口,最简单的情况,只取出1个
            for (int i = 0; i <= end; i++) 
                System.out.print(source[i]);
            
            System.out.println();
         else // 多个全排列
            for (int i = start; i <= end; i++) 
                char temp = source[start];// 逐位交换
                source[start] = source[i];
                source[i] = temp;

                perm(source, start + 1, end);// 递归全排列
                // 还原,为下个替换做准备
                temp = source[start];
                source[start] = source[i];
                source[i] = temp;
            
        
    
    
    public static void main(String[] args) 
          
      //char[] source =  \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'Aa-Zz...\';
        char[] source =  \'0\', \'1\', \'2\', \'3\', \'4\',\'5\',\'6\',\'7\',\'8\',\'9\' ;
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 1; i <= source.length; i++) 
            list.clear();
            //选出
            select(source, list, i);
            System.out.println("===========取出"+i+"个==============");
            //排列
            for (String str : list) 
                char[] temp = str.toCharArray();
                perm(temp, 0, temp.length - 1);
            
        
    
参考技术A lz的问题没看明白,你可以尝试这样写:
public static final String mixings = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String getRandomStr(int length)
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++)
sb.append(mixings.charAt(random.nextInt(mixings.length())));

return sb.toString();

length是你想要的字符串的长度;你如果想要1-62种长度的话再加一个for循环即可;这个结果可是相当大的,要慎重啊
参考技术B import java.util.ArrayList;
import java.util.List;

/**
* @author lyon_yao
*
*/
public class Test
public static void main(String []a)
List<String> list=new ArrayList<String>();
String value="0123456789abcdefghijklmnopqrstuvwmnxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] chars=value.toCharArray();
for(char c:chars)
list.add(String.valueOf(c));

System.out.println(list);
List<String> result=new ArrayList<String>();
for(char c:chars)
result.add(String.valueOf(c));

new Test().run(list,1);

public void run(List<String> last,int index)
int size = last.size();
for(int j=0;j<size-index;j++)
String temp="";
for(int i=0;i<index&&i+j<size;i++)
temp+=last.get(j+i);

System.out.println(temp);

if(index<size)
run(last,++index);



你测试一下看是要的效果不
参考技术C public class TestPL 
static String[] array = "0","1","2","3";

public static void main(String[] args) 
for(int i=0;i<array.length;i++)
sort("",i+1);



public static void sort(String leftString, int leftLen)
if(leftLen == 0)
System.out.println(leftString);
return;

for(int i=0;i<array.length;i++)
if(leftString.indexOf(array[i]) != -1)
continue;
else
sort(leftString+array[i],leftLen-1);




如果你要的是排列的话,就是认为12和21是不同的可能,那么上面这段程序就能满足你的需求,自己增加要排列的项就可以了。如果认为12和21是不同的,那么需要一点改动。

参考技术D 62层循环嵌套,或使用递归

以上是关于关于各种排列组合java算法实现方法的主要内容,如果未能解决你的问题,请参考以下文章

java字母和数字排列组合后

字符串数组全排列——逐个追加组合算法

排序算法分析-java实现

基于python快速实现排列组合算法

js两个数组排列组合

全排列算法实现