java组合排列算法

来源:互联网 发布:剑三数据库 编辑:程序博客网 时间:2024/06/05 09:39
/**     * 实现的算法     * @param a 数据数组     * @param num M选N中 N的个数(无序) Cmn     * @return     */    public static List<String> combine(String[] a, int num) {        List<String> list = new ArrayList<String>();        StringBuffer sb = new StringBuffer();        String[] b = new String[a.length];        for (int i = 0; i < b.length; i++) {            if (i < num) {                b[i] = "1";            } else                b[i] = "0";        }        int point = 0;        int nextPoint = 0;        int count = 0;        int sum = 0;        String temp = "1";        while (true) {            // 判断是否全部移位完毕            for (int i = b.length - 1; i >= b.length - num; i--) {                if (b[i].equals("1"))                    sum += 1;            }            // 根据移位生成数据            for (int i = 0; i < b.length; i++) {                if (b[i].equals("1")) {                    point = i;                    sb.append(a[point]);                    sb.append(" ");                    count++;                    if (count == num)                        break;                }            }            //输出数据//            System.out.println(sb.toString());            // 往返回值列表添加数据            list.add(sb.toString());            // 当数组的最后num位全部为1 退出            if (sum == num) {                break;            }            sum = 0;            // 修改从左往右第一个10变成01            for (int i = 0; i < b.length - 1; i++) {                if (b[i].equals("1") && b[i + 1].equals("0")) {                    point = i;                    nextPoint = i + 1;                    b[point] = "0";                    b[nextPoint] = "1";                    break;                }            }            // 将 i-point个元素的1往前移动 0往后移动            for (int i = 0; i < point - 1; i++)                for (int j = i; j < point - 1; j++) {                    if (b[i].equals("0")) {                        temp = b[i];                        b[i] = b[j + 1];                        b[j + 1] = temp;                    }                }            // 清空 StringBuffer            sb.setLength(0);            count = 0;        }        //        System.out.println("数据长度 " + list.size());        return list;    }

传参为{“1”,“2”,“3”,“4”,“5”}和3 

结果如下:

/**     * 实现的算法     * @param ss 数据数组     * @param i M选N中 N的个数(有序) Amn     * @return     */  private static int sum = 0;    public static void permutation(String[]ss,int i){        if(ss==null||i<0 ||i>ss.length){            return;        }        if(i==ss.length){            StringBuilder sb = new StringBuilder("");            for (int j = 0; j < ss.length; j++) {                sb.append(ss[j]+" ");            }//            System.out.println(new String(ss));            System.out.println(sb.toString());            sum++;            System.out.println("排列组合有:"+sum);        }else{            for(int j=i;j<ss.length;j++){//                char temp=ss[j];//交换前缀,使之产生下一个前缀                String temp=ss[j];//交换前缀,使之产生下一个前缀                ss[j]=ss[i];                ss[i]=temp;                permutation(ss,i+1);                temp=ss[j]; //将前缀换回来,继续做上一个的前缀排列.                ss[j]=ss[i];                ss[i]=temp;            }        }    }    public static void main(String args[]){//        char []ss={'a','c','b'};        String[] ss = {"a","c","b"};        permutation(ss,0);    }
结果如下:


原创粉丝点击