- 论坛徽章:
- 0
|
不考虑重复元素的话,就是个全排列的问题。
传入一维的阵列arr(arr = { “1”,”2'”}) 与 字元 'X'
其实就是,{1,2,X}的全排列
给定一个一维数组 A1,A2....AN,求出所有的可能排列:
1)当N=1
就直接返回{{A1}}
2)当N>1时,取出 A1
剩下的元素作一个全排列,返回全部可能的数组排列(二维数组)假如为RET[j][k]
那么,对其中每一个数组
RET[j]={ r1,r2,r3,r4....rm }
插入A1 到这个数组(RET[j])的每一个可能位置(可能位置为数组长度加1)
这样得到二维数组RET[j*(k+1)][k+1]就是所求的全排列
Java实现:
- public class Test {
- /**
- * @param args
- *
- */
- public static void main(String[] args) throws Exception {
- int testa[]={1,2,3,4};
- int[][] ret=align(testa,0,4);
- printTDArray(ret);
-
- }
-
- private static void printTDArray(int[][] a)
- {
- StringBuffer buffer=new StringBuffer("{\n");
- for(int j=0;j<a.length;j++)
- {
- buffer.append("{");
- for(int k=0;k<a[j].length;k++)
- {
- buffer.append(a[j][k]);
- if(k<a[j].length-1)
- {
- buffer.append(",");
- }
- }
- buffer.append("}\n");
- }
- buffer.append("}");
- System.out.println(buffer.toString());
-
- }
-
- public static int[][] arrayAlignInsert(int a[],int x)
- {
- int[][] ret=align(a,0,a.length);
- ret=arrayInsert(ret,x);
- return ret;
-
- }
-
- public static int[][] align(int[] a,int off,int len)
- {
- if(len==0)
- {
- throw new IllegalArgumentException();
- }
- if(len==1)
- {
- int[][] ret=new int[1][1];
- ret[0]=new int[1];
- ret[0][0]=a[off];
- return ret;
- }
- int[][] preRet=align(a,off+1,len-1);
- return arrayInsert(preRet,a[off]);
-
- }
- private static int[][] arrayInsert(int[][] preRet,int toInsert)
- {
- int[][] toRet=new int[preRet.length*(preRet[0].length+1)][preRet[0].length+1];
- for(int k=0;k<preRet.length;k++)
- {
- for(int j=0;j<=preRet[0].length;j++)
- {
- toRet[k*(preRet[0].length+1)+j]=inertOneAtPos(preRet[k],j,toInsert);
- }
- }
- return toRet;
- }
-
- private static int[] inertOneAtPos(int[] arr,int pos,int toInsert)
- {
- int ret[]=new int[arr.length+1];
- if(pos>0)
- {
- System.arraycopy(arr, 0, ret, 0, pos);
- }
- ret[pos]=toInsert;
- if(pos<arr.length)
- {
- System.arraycopy(arr, pos, ret, pos+1, arr.length-pos);
- }
- return ret;
-
- }
- }
复制代码
输出:
- {
- {1,2,3,4}
- {2,1,3,4}
- {2,3,1,4}
- {2,3,4,1}
- {1,3,2,4}
- {3,1,2,4}
- {3,2,1,4}
- {3,2,4,1}
- {1,3,4,2}
- {3,1,4,2}
- {3,4,1,2}
- {3,4,2,1}
- {1,2,4,3}
- {2,1,4,3}
- {2,4,1,3}
- {2,4,3,1}
- {1,4,2,3}
- {4,1,2,3}
- {4,2,1,3}
- {4,2,3,1}
- {1,4,3,2}
- {4,1,3,2}
- {4,3,1,2}
- {4,3,2,1}
- }
复制代码
[ 本帖最后由 yovn 于 2007-1-26 18:08 编辑 ] |
|