JAVA再帰と非再帰出力文字列の全配列

2391 ワード

出力する文字sは、[start,end]間の全配列から、s[start,end]を順にs[start]に置き換えて出力する場合は、[start+1,end]の全配列からすれば良い。
//       
	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