思路:
求n位字符的全排列,先确定第一个字符,然后n-1个字符进行全排列,对n-1个字符全排列,先确定第二个字符,对n-2个字符全排列。。。。到第n-2个字符时,就是将最后两个字符交换位置。
以具体数组来说明
123的全排列:123,132,213,231,321,312;
具体过程:
1.第一位1,对23进行交换得到全排列:123,132;
2.交换2,1,对13进行全排列:213,231;
3.交换3,1,对21进行全排列:321,312;
void swap(elemtype *a, elemtype *b) {
elemtype temp;
temp = *a;
*a = *b;
*b = temp;
}
void qpl(elemtype list[], int l, int r) {
int j;
if (l == r) {
for (int a = 0; a <5; a++) {
printf("%d", list[a]);;
}
printf("\n");
}
for (j = l; j <= r; j++) {
swap(&list[j], &list[l]);
qpl(list, l + 1, r);
swap(&list[j], &list[l]);
}
}
由这两个函数我们可以粗略的的实现全排列的功能,但我们无法处理含有相同字符的数组的情况,因此,我们需要对这种情况进行判断,去重,然后进行全排列。
int IsSwap(elemtype list[], int l, int r) {
for (int i = l; i < r; i++) {
if (list[i] == list[r])
return 0;
}
return 1;
}
来测试一下吧