算法题目:
求一个全排列函数:
如p([1,2,3])输出:[123],[132],[213],[231],[321],[323].
思路:采用字典序的排序的方法
代码实现:
void swap(char *a,char *b) { char temp; temp=*a; *a=*b; *b=temp; } void reverse(char *dic ,int start,int end) { int i=start,j=end; for(;i<=j;i++,j--) swap(dic[i],dic[j]); } void perm (char *dic) { bool flag; while() { Print(dic); flag = true; int i,l; for(i=size ; i>=1;i--) { if(dic[i]>dic[i-1]) { flag = false;break; } } if(flag) break; for(l=size;l>i-1;l--) { if(dic[l]>dic[i-1]) break; } swap(dic[i-1],dic[l]); reverse(dic,i-1,size-1); } }
算法设计
求一个组合函数
如p([1,2,3])输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]
思路:设一个数组a,数组a中的数必须是0和1当中的一个,将待组合数每一个数关联到数组中,接着按照二进制的规则,对数组a构建成的二进制数一步一步加1,在这个过程中,数组a每次构建一个二进制的数,对应数组为1的待组合数集合当中的数立即输出,构成一次组合,依次类推。
void cov(int num,int *a,int size) { int mark=num; for(int i=size-1;mark!=0;mark/=2,i--) { if(mark%2) a[i]=1; else a[i]=0; } } void combine1(char *dic, int size) { int a[size]; long int max=2*size for(long int i=1;i<=max;i++) { for(int j=0;j<size;j++) a[j]=0; cov(i,a,size); for(int j=0;j<size;j++) { if(a[j]==1) { printf(“%c,”,dic[j]); } } printf(“\n”); } }
注:以上还可以用字典树实现效率或更高些