JAVA递归和非递归输出字符串的全排列

要输出字符s从[start,end]间的全排列,只要将s[start,end]依次与s[start]替换并输出s从[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)重复(2)直到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<j && charArray[i] < tmp)
					++i;
				if(i < j)
					charArray[j--] = charArray[i];
				while(i<j && charArray[j] > tmp)
					--j;
				if(i<j)
					charArray[i++] = charArray[j];
			}
			charArray[i] = tmp;
			quickSort(charArray,begin,i-1);
			quickSort(charArray,i+1,end);
			
		}
	}
	private static void outputArray(char[] charArray)
	{
		for(char ch : charArray)
			System.out.print(ch);
		System.out.println();
	}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值