代码改变世界

快速的4个数的全排列

2011-06-18 11:17  x_feng  阅读(1171)  评论(0编辑  收藏  举报

这只是一个非通用的方法,对于计算4个数或5个数以下的全排速度比较快,但是5以上就有点麻烦。

分析:如求abcd的全排列,我们看看abcdabcd,由a开始扫a->bcd,a->cdab,a->dabc,只考察a后面的三个,重复的a去掉(黑体表示),然后再考虑逆转字符串dcbadcba,看看从a开始的:a->dcb,a->cbad,a->bdc(这里像循环一样)。

void perm(char *arr, int size)
{
	for (int pos = 0; pos < size/2; pos++)
	{
		int index = 1;
		for (int i = 0; i < size/2 - 1; i++)
		{
			cout<<arr[pos]<<"->";
			int k = 0;
			int j = 0;
			while(k < size/2 - 1)
			{
				if (arr[pos] != arr[(pos + index + j)%size])
				{
					k++;
					cout<<arr[(pos + index + j)%size]<<" ";
				}
				j++;
			}
		    index++;
			cout<<endl;
		}
	}
}

输出结果为:

无标题

	char *ch =  "abcdabcd";
	perm(ch, 8);
	char *chf = "dcbadcba";
	perm(chf, 8);

如果有更好的建议,烦请告知。