1、组合
package com.ubs.is;
import java.util.ArrayList;
import java.util.BitSet;
public class Combination {
private ArrayList<String> combList = new ArrayList<String>();
public void mn(String[] array, int n) {
int m = array.length;
if (m < n)
throw new IllegalArgumentException("Error m < n");
BitSet bs = new BitSet(m);
for (int i = 0; i < n; i++) {
bs.set(i, true);
}
do {
printAll(array, bs);
} while (moveNext(bs, m));
}
private boolean moveNext(BitSet bs, int m) {
int start = -1;
while (start < m)
if (bs.get(++start))
break;
if (start >= m)
return false;
int end = start;
while (end < m)
if (!bs.get(++end))
break;
if (end >= m)
return false;
for (int i = start; i < end; i++)
bs.set(i, false);
for (int i = 0; i < end - start - 1; i++)
bs.set(i);
bs.set(end);
return true;
}
private void printAll(String[] array, BitSet bs) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++)
if (bs.get(i)) {
sb.append(array[i]).append(',');
}
sb.setLength(sb.length() - 1);
combList.add(sb.toString());
}
public ArrayList<String> getCombList() {
return combList;
}
private void pp(int count,int selected){
String[] source = new String[count];
for(int i=0;i<count;i++){
source[i]=""+i;
}
Combination comb = new Combination();
comb.mn(source, selected);
for (int i = 0; i < comb.getCombList().size(); i++) {
//System.out.println(comb.getCombList().get(i));
}
System.out.println("total:"+comb.getCombList().size()+":"+count+","+selected);
}
public static void main(String[] args) throws Exception {
int count=10;
int selected=5;
String[] source = new String[count];
for(int i=0;i<count;i++){
source[i]=""+i;
}
Combination comb = new Combination();
comb.mn(source, selected);
for (int i = 0; i < comb.getCombList().size(); i++) {
System.out.println(comb.getCombList().get(i));
//String[] list = comb.getCombList().get(i).split(",");
//Arrange ts = new Arrange();
//ts.perm(list, 0, list.length - 1);
//for (int j = 0; j < ts.getArrangeList().size(); j++) {
//System.out.println("/u0009" + ts.getArrangeList().get(j));
//}
}
System.out.println("total:"+comb.getCombList().size());
comb.pp(10,1);
comb.pp(10,2);
comb.pp(10,3);
comb.pp(10,4);
comb.pp(10,5);
comb.pp(10,6);
comb.pp(10,7);
comb.pp(10,8);
comb.pp(10,9);
}
}
2、排列
package com.ubs.is;
import java.util.ArrayList;
public class Arrange {
private int total = 0;
private ArrayList<String> arrangeList = new ArrayList<String>();
public Arrange() {
}
private void swap(String list[], int k, int i) {
String c3 = list[k];
list[k] = list[i];
list[i] = c3;
}
public void perm(String list[], int k, int m) {
if (k > m) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i <= m; i++) {
sb.append(list[i]).append(",");
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
arrangeList.add(sb.toString());
total++;
} else {
for (int i = k; i <= m; i++) {
swap(list, k, i);
perm(list, k + 1, m);
swap(list, k, i);
}
}
}
public int getTotal() {
return total;
}
public ArrayList<String> getArrangeList() {
return arrangeList;
}
public static void main(String args[]) {
String list[] = { "1", "2", "3", "4", "5" };
Arrange ts = new Arrange();
ts.perm(list, 0, list.length - 1);
for (int i = 0; i < ts.getArrangeList().size(); i++) {
System.out.println(ts.getArrangeList().get(i));
}
System.out.println("total:" + ts.total);
}
}
3、调用
package com.ubs.is;
import java.util.ArrayList;
public class ArrangeCombine {
public static ArrayList<String> getArrangeOrCombine(String[] args, int n,
boolean isArrange) throws Exception {
if (args.length <= 0) {
throw new Exception("array.length<=0");
}
if (n > args.length) {
throw new Exception(" n>array.length");
}
Combination comb = new Combination();
comb.mn(args, n);
if (!isArrange) {
return comb.getCombList();
}
ArrayList<String> arrangeList = new ArrayList<String>();
for (int i = 0; i < comb.getCombList().size(); i++) {
String[] list = comb.getCombList().get(i).split(",");
Arrange ts = new Arrange();
ts.perm(list, 0, list.length - 1);
for (int j = 0; j < ts.getArrangeList().size(); j++) {
arrangeList.add(ts.getArrangeList().get(j));
}
}
return arrangeList;
}
}
相关推荐
排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。
本资源附带文档解释了排列组合算法的实现和原理。其中排列算法是基于递归实现的,组合算法是基于高效的位移法实现的。代码是使用Java版实现的。
排列组合 排列 组合 java排列组合算法 排列组合算法
Java排列组合算法 - 郭睿的专栏 - CSDN博客Java排列组合算法 - 郭睿的专栏 - CSDN博客
6位数,共有几种排列组合的算法,java实现
Java排列组合算法
Java排列组合_组合算法,利用list及set的无序性, 通过递归实现,不同于以往的排列组合 自娱自乐
从n个数组中取出所有排列组合(Java实现)
此外,文档还提供了各种排列组合算法的详细代码示例和实现细节,包括递归和迭代方法。文档还涵盖了高级主题,如如何计算有重复元素的排列组合数量,以及如何优化这些算法的性能。 无论您是Java编程的初学者还是有...
介绍了几种用JAVA实现的排列组合算法,有需要的朋友可以参考一下
所使用的算法应该是效率最高的算法,而且这两个类都只是对需要排列组合的数组的下标进行处理,所以能对任何类型的数组进行排列组合。
主要为大家详细介绍了高效的java版排列组合算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了JAVA实现abc字符串的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了Java实现多个数组间的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
用java语言写的组合数学中生成排列算法的代码,并由界面
这是算法课老师叫我们做的一个算法作业,我是按照他说的写的,如果自己写的话完全用不着那么多行,呵呵。
实现了排列组合算法的类(JAVA),实现了排列组合算法的类(JAVA)
用JAVA来计算并按条件来排列时间 现在把符合奇偶数排列的时间排列出来
阶乘与排列组合算法!在各行各业都能用得到的,比较彩票业,以及复杂的生产环境预测等软件开发
主要介绍了Java实现字符数组全排列的方法,涉及Java针对字符数组的遍历及排序算法的实现技巧,需要的朋友可以参考下