import java.util.*;public class Test { static int count; public static void main(String[] args) { int[] num={1,2,3,4,5,7,9,6,8,10}; Arrays.sort(num); sorted(num); }
OK,那么这样,我9楼的思想,对应的是下面的代码(排序过程略) public class CatalanNumber { // int[] value=new int[]{12,4,3,6,7,1,11,2,9,8,10}; static int[] value = new int[]{1,2,3,4,6,7,8,9,10,11,12}; //排序算法略 static int count = 0; public static void main(String[] args) { List list1 = new ArrayList(); //此排要高 List list2 = new ArrayList(); //此排要小,应该先排 arrange(list1, list2, 0); }
private static void arrange(List list1, List list2, int position){ if (position==value.length){ //得到一个排列 count++; System.out.println("" + count + ":"); System.out.println("List 1:" + list1); System.out.println("List 2:" + list2); }else if (list1.size()>list2.size()){ //已经成为了特例 list1.add(value[position]); //干脆维持特例 arrange(list1, list2, position+1); }else{ List list1Cpy = new ArrayList(list1); List list2Cpy = new ArrayList(list2); list1.add(value[position]); //可以加到一排 arrange(list1, list2, position+1); list2Cpy.add(value[position]); //也可以加到二排 arrange(list1Cpy, list2Cpy, position+1); } }}
直接排一排,右边比左边高(升序)即可。(任何排序方法都可以)然后依次(从0到length-1)断取偶数序号的数字放第一排,断取奇数序号的数字放到第二排
如果需要输出全部结果,用回溯做这个比较不错
1. 依然要先排序
2. 按序号从0到length-1将每个元素分往某排,每个序号上的元素可自由选择去第一排还是去第二排,只需要遵守两个原则:
2.1 已分到第一排的个数必须不大于已分到第二排的个数
上例的特殊情况是
2.2 如果大于了,则后面所有数字必须全放第一排
还有就是用Java打印输出,怎么实现让元素自由选择。 谢谢
static int count;
public static void main(String[] args)
{
int[] num={1,2,3,4,5,7,9,6,8,10};
Arrays.sort(num);
sorted(num);
}
public static void sorted(int[] num){
combination(num,0,0,num.length,num.length /2);
System.out.println("有"+count+"种方法");
}
public static void combination(int a[],int start,int step,int n,int m)
{
if(step==m)
{
//count++;
int [] num1=new int[a.length /2];
int [] num2=new int[a.length /2];
for(int i=0;i<m;i++)
{
num1[i]=a[i];
}
for(int i=m;i<a.length;i++)
{
num2[i-a.length /2]=a[i];
}
if(isOk(num1,num2))
{
count++;
for(int i=0;i<num1.length;i++)
System.out.print(num1[i]+" ");
System.out.print("\n");
for(int i=0;i<num2.length;i++)
System.out.print(num2[i]+" ");
System.out.print("\n\n");
} }
else
{
for(int j=start;j<n;j++)
{
int temp=a[step];
a[step]=a[j];
a[j]=temp;
combination(a,j+1,step+1,n,m);
a[j]=a[step];
a[step]=temp;
}
}
}
public static boolean isOk(int[] num1,int []num2)
{
Arrays.sort(num1);
Arrays.sort(num2);
for(int i=0;i<num1.length;i++)
{
if(num1[i]<num2[i])
return false;
}
return true;
}
}print:2 4 6 8 10
1 3 5 7 9 2 4 6 9 10
1 3 5 7 8 2 4 7 8 10
1 3 5 6 9 2 4 7 9 10
1 3 5 6 8 2 4 8 9 10
1 3 5 6 7 2 5 6 8 10
1 3 4 7 9 2 5 6 9 10
1 3 4 7 8 2 5 7 8 10
1 3 4 6 9 2 5 7 9 10
1 3 4 6 8 2 5 8 9 10
1 3 4 6 7 2 6 7 8 10
1 3 4 5 9 2 6 7 9 10
1 3 4 5 8
.
.
.
有42种方法
public class CatalanNumber {
// int[] value=new int[]{12,4,3,6,7,1,11,2,9,8,10};
static int[] value = new int[]{1,2,3,4,6,7,8,9,10,11,12}; //排序算法略
static int count = 0; public static void main(String[] args) {
List list1 = new ArrayList(); //此排要高
List list2 = new ArrayList(); //此排要小,应该先排
arrange(list1, list2, 0);
}
private static void arrange(List list1, List list2, int position){
if (position==value.length){ //得到一个排列
count++;
System.out.println("" + count + ":");
System.out.println("List 1:" + list1);
System.out.println("List 2:" + list2);
}else if (list1.size()>list2.size()){ //已经成为了特例
list1.add(value[position]); //干脆维持特例
arrange(list1, list2, position+1);
}else{
List list1Cpy = new ArrayList(list1);
List list2Cpy = new ArrayList(list2);
list1.add(value[position]); //可以加到一排
arrange(list1, list2, position+1);
list2Cpy.add(value[position]); //也可以加到二排
arrange(list1Cpy, list2Cpy, position+1);
}
}}