全排列的算法种类很多,下面的一种是去重全排列算法,但是依赖排序算法用于去重,采用递归实现,代码很容易懂
后记:算法有严重的BUG,针对序列aabbccd,算法无法得到正确的个数(630),主要原因是在交换元素的时候,并不能保证有序。这个算法是抄袭网络上的算法,年轻的时候真实糊涂
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
int cmp_char(const void *e1, const void *e2) {
return *(char *)e1 - *(char *)e2;
}
void swap_char(char *e1, char *e2) {
char c;
c = *e1, *e1= *e2, *e2 = c;
}
void Permutation(char *a, int index, int len) {
if (index+1 == len) {
puts(a);
return ;
}
for (int i=index; i<len; ++i) {
if (a[i]==a[i+1]) continue; // 去重
swap_char(&a[index], &a[i]);
Permutation(a, index+1, len);
swap_char(&a[i], &a[index]);
}
}
int main()
{
// 全排列
char a[BUFSIZ];
memset(a, 0, BUFSIZ);
gets(a);
assert(strlen(a)<BUFSIZ);
qsort(a, strlen(a), sizeof(char), cmp_char); // 用于去重
Permutation(a, 0, strlen(a));
return 0;
}