算法题目:
求一个全排列函数:
如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;elsea[i]=0;} }void combine1(char *dic, int size) {int a[size];long int max=2*sizefor(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”);} }
注:以上还可以用字典树实现效率或更高些