输出 可重叠元素数组的从小到大排列
问题 描述:
将一组整数输入到数组p,输出p从小到大的全排列,p的元素可重叠
代码描述:
1 //从小到大可重排列 2 #include<stdio.h> 3 int A[20]; 4 int p[20]; 5 int n; 6 7 void sort(int n,int *p) 8 { 9 for(int i=0;i<n-1;i++) 10 { 11 int min =i; 12 for(int j=i+1;j<n-1;j++) 13 { 14 if(p[j]<p[min]) min=j; 15 } 16 if(min!=i) 17 { 18 int temp=p[i]; 19 p[i]=p[min]; 20 p[min]=temp; 21 } 22 } 23 } 24 void permutation(int n,int *a,int *p,int cur) 25 { 26 if(cur==n) //如果游标到了最后,输出即可 27 { 28 for(int i=0;i<n;i++) printf("%-3d",a[i]); 29 printf("\n"); 30 return; 31 } 32 else 33 { 34 for(int i=0;i<n;i++) 35 { 36 if(i&&p[i]==p[i-1]) a[cur++]=p[i]; //p[i]!=p[i-1]是为了避免相同的元素多排而重复输出 37 else 38 { 39 int c1=0,c2=0; 40 for(int j=0;j<n;j++) if(p[i]==p[j]) c1++; 41 for(j=0;j<cur;j++) if(p[i]==a[j]) c2++; 42 if(c2<c1) 43 { 44 a[cur]=p[i]; 45 permutation(n,a,p,cur+1); 46 } 47 } 48 } 49 } 50 } 51 int main() 52 { 53 54 while(scanf("%d",&n)==1) 55 { 56 for(int i=0;i<n;i++) scanf("%d",&p[i]); 57 sort(n,p); 58 permutation(n,A,p,0); 59 } 60 return 0; 61 }
运行结果: