递归(分治法思想):
设(ri)perm(X)表示每一个全排列前加上前缀ri得到的排列.
当n=1时,perm(R)=(r) 其中r是唯一的元素,这个就是出口条件.
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),...(rn)perm(Rn)构成.
public class 全排列 {
/**
* @param args
*/
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
Set<String> set = new HashSet<String>();
set.add( "1" );
set.add( "2" );
set.add( "3" );
set.add( "4" );
printAll( sb,set );
int[] a={5,6,7};
perm(a,0,3);
}
private static void printAll( StringBuilder sb, Set<String> set )
{
if( set.isEmpty() )
{
System.out.println(sb.toString());
return;
}
for( String s : set )
{
sb.append( s );
printAll( sb,remove( set, s ) );
sb.delete(sb.length()-1, sb.length());
}
}
private static Set<String> remove( Set<String> set, String s )
{
Set<String> result = new HashSet<String>();
for( String str : set )
result.add( str );
result.remove( s );
return result;
}
//标准递归解答
static void perm(int[] list, int k, int m )
{
if( k == m-1 )
{
for( int i=0 ; i<m ; i++ )
{
System.out.print( list[i]);
}
System.out.println();
}
for( int i=k ; i<m ;i++ )
{
// 交换前缀,使之产生下一个前缀
swap( list, i, k);
perm( list, k+1, m);
//将前缀换回来,继续做上一个的前缀排列
swap( list, k, i);
}
}
static void swap( int[] list, int i, int k )
{
int temp = list[i];
list[i] = list[k];
list[k] = temp;
}
}