快速的4个数的全排列
2011-06-18 11:17 x_feng 阅读(1242) 评论(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);
如果有更好的建议,烦请告知。

浙公网安备 33010602011771号