输出 可重叠元素数组的从小到大排列

问题 描述:

将一组整数输入到数组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 }

运行结果:

 

posted @ 2020-04-19 11:47  kakusan  阅读(204)  评论(0编辑  收藏  举报