排列
字符串“abc”的全排列:
abc
acb
bac
bca
cba
cab
求整个字符串的排列,可以分为两步:
第一步,求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二步,固定第一个字符,求后面所有字符的全排列。这个时候仍然把后面所有字符分为两部分:第一个字符以及其后所有字符。这是一个典型的递归问题。
例如字符串“abc”的全排列:以a开头的全排列是a{bc},递归得到bc的全排列,而bc的全排列又是以b开头,c的全排列(即c自己);
同样,以b开头的全排列是b{ac},递归得到ac的全排列,而ab的全排列又是以a开头,c的全排列。……
http://blog.csdn.net/cinderella_niu/article/details/42930281
无重复的全排列 递归方法
如下是递归算法:
//全排列
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void Permutation(char str[], int index, int size) {
cout << "Permutation(" << index << ", " << size << ")" << endl;
if (index == size - 1) {
//cout << "全排列:"; //cout << str << endl;由于是全排列,还可以用这句打印结果
for (int i = 0; i < size; i++)
cout << str[i];
cout << endl;
}
else {
for (int i = index; i < size; i++) {
//cout << "\t" << str;
swap(str[index], str[i]);
//cout << " swap(" << index << ","<< i << ") " << str << endl;
Permutation(str, index + 1, size);
//cout << "---\t" << str;
swap(str[index], str[i]);
//cout << " swap(" << index << ","<< i << ") " << str << endl << endl;
}
}
}
int main() {
char test[] = "abc";
Permutation(0, sizeof(test) - 1);
}
下图分别是运行注释内语句和去掉注释内语句的运行结果:
另一种写法: