java组合排列算法
2017-10-10 14:37
435 查看
/** * 实现的算法 * @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()
4000
);
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);
}结果如下:
相关文章推荐
- 排列组合算法 的java实现
- java排列组合算法(n选n)
- java排列组合算法代码实现
- 针对较大基数的排列组合算法Java实现类(n选m)
- java 高效率的排列组合算法(java实现)
- 高效率的排列组合算法(java实现)
- (转) java排列组合算法(n选m)
- 排列组合算法(Java)
- 排列组合算法总结(含Java实现)
- 编程技巧:Java面向对象的排列组合算法
- 排列组合算法总结(含Java实现)
- C++和java中关于全排列和组合的有关算法
- Java 算法设计 多数组排列组合问题
- 排列组合算法之二: 01转换法_java改变后的c++改进版
- java 高效率的排列组合算法(java实现)
- java求组合排列算法
- Java实现排列组合算法
- java排列组合算法代码实现
- 排列组合算法之一: 01转换法_java改变后的c++版
- 高效率的排列组合算法(java实现)