JAVA再帰と非再帰出力文字列の全配列
2391 ワード
出力する文字sは、[start,end]間の全配列から、s[start,end]を順にs[start]に置き換えて出力する場合は、[start+1,end]の全配列からすれば良い。
(1)文字列sを昇順に並べ替え、出力文字列(2)は、最初の隣接する非逆順ペアの最初の要素の位置i(例えば、12354の後から前の最初の隣接非逆順ペアは25、位置は2、注:開始位置0)を後から前に見つけ、s[i]より大きい最初の要素の位置j(例では4の位置、すなわち4)を後から検索する。s[i]とs[j]を交換し、sをi+1から終了まで昇順で並べ替え、出力文字列(3)はsのすべての要素が逆順であるまで(2)のiは-1である。
//
public static void fullPermutation(String s)
{
permutation(s.toCharArray(),0,s.length()-1);
}
private static void permutation(char[] charArray,int start,int end)
{
if(start == end)
System.out.println(new String(charArray));
else
{
for(int i = start;i<=end;++i)
{
if((i!= start && charArray[start] != charArray[i]) || i==start)
{
swapChar(charArray,start,i);
permutation(charArray,start+1,end);
swapChar(charArray,start,i);
}
}
}
}
private static void swapChar(char[] charArray,int index1 ,int index2)
{
if(index1 < charArray.length && index2 < charArray.length)
{
char tmp = charArray[index1];
charArray[index1] = charArray[index2];
charArray[index2] = tmp;
}
}
非再帰的アルゴリズム:(1)文字列sを昇順に並べ替え、出力文字列(2)は、最初の隣接する非逆順ペアの最初の要素の位置i(例えば、12354の後から前の最初の隣接非逆順ペアは25、位置は2、注:開始位置0)を後から前に見つけ、s[i]より大きい最初の要素の位置j(例では4の位置、すなわち4)を後から検索する。s[i]とs[j]を交換し、sをi+1から終了まで昇順で並べ替え、出力文字列(3)はsのすべての要素が逆順であるまで(2)のiは-1である。
public static void fullPermutationWithoutRecursion(String s)
{
if(s.length() == 0)
return;
if(s.length() == 1)
{
System.out.println(s);
return;
}
char[] charArray = s.toCharArray();
quickSort(charArray,0,charArray.length - 1);
outputArray(charArray);
while(true)
{
int i = charArray.length - 1;
while(i > 0)//i 。
if(charArray[i] > charArray[i-1])
break;
else
--i;
if(i == 0)
return;
else
--i;
int j = charArray.length - 1;
while(j > i)// s[i]
{
if(charArray[j] > charArray[i])
break;
else
--j;
}
swapChar(charArray,i,j);
quickSort(charArray,i+1,charArray.length-1);
outputArray(charArray);
}
}
public static void quickSort(char[] charArray,int begin,int end)
{
if(begin < end)
{
int flag = begin + (int)Math.ceil(Math.random()*(end - begin));
char tmp = charArray[flag];
swapChar(charArray,flag,end);
int i = begin,j = end;
while(i < j)
{
while(i tmp)
--j;
if(i