/**
* @author super
* @since 2013-5-31 下午2:28:59
* @version 1.0
*/
import java.util.Stack;
/**
* JAVA获得一个数组的指定长度的排列组合。
*
* @author JAVA世纪网(java2000.net, laozizhu.com)
*/
public class TestSequenceAll {
public static void main(String[] args) {
TestSequenceAll t = new TestSequenceAll();
// int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
int[] arr = {1, 2, 3, 4, 5};
// 循环获得每个长度的排列组合
for (int num = 1; num <= arr.length; num++) {
t.getSequence(arr, 0, num);
}
}
// 存储结果的堆栈
private Stack stack = new Stack();
/**
* 获得指定数组从指定开始的指定数量的数据组合
*
* @param arr
* 指定的数组
* @param begin
* 开始位置
* @param num
* 获得的数量
*/
public void getSequence(int[] arr, int begin, int num) {
if (num == 0) {
System.out.println(stack); // 找到一个结果
} else {
// 循环每个可用的元素
for (int i = begin; i < arr.length; i++) {
if (stack.size() > 0) {
int tmp = stack.pop();
if (arr[i] < tmp){
stack.push(tmp);
continue;
}
else
stack.push(tmp);
}
// 当前位置数据放入结果堆栈
stack.push(arr[i]);
// 将当前数据与起始位置数据交换
swap(arr, begin, i);
// 从下一个位置查找其余的组合
getSequence(arr, begin + 1, num - 1);
// 交换回来
swap(arr, begin, i);
// 去除当前数据
stack.pop();
}
}
}
/**
* 交换2个数组的元素
*
* @param arr
* 数组
* @param from
* 位置1
* @param to
* 位置2
*/
public static void swap(int[] arr, int from, int to) {
if (from == to) {
return;
}
int tmp = arr[from];
arr[from] = arr[to];
arr[to] = tmp;
}
}
阅读(3264) | 评论(0) | 转发(0) |