有序全排列

比如对123进行全排列,输出

最后两个是3 1 2和 3 2 1 而不是 3 2 1和 3 1 2

所以这就需要在每次交换左端值后将交换的两元素之间的元素进行有序化。

 1 #include<stdio.h>
 2 
 3 int a[10000];
 4 void change(int *p, int *q)
 5 {
 6     int t;
 7     t = *q;
 8     *q = *p;
 9     *p = t;
10 }
11 void cirr(int a[], int l, int r)
12 {
13     if(l>=r)//少了这个真是裂开
14         return;
15     else
16     {
17         int i,t;
18         t = a[r];
19         for(i=r-1; i>=l; i--)
20         {
21             a[i+1] = a[i];
22         }
23         a[l] = t;
24     }
25 }//这个当移动第一个数的时候会出现l>r的情况,后面再交换值时,如果只有一个元素,那么都l==r
26 void cirl(int a[], int l,int r)
27 {
28     if(l>=r)
29         return;
30     else
31     {
32         int i,t;
33         t = a[l];
34         for(i=l; i<r; i++)
35         {
36             a[i] = a[i+1];
37         }
38         a[r] = t;
39     }
40 
41 }
42 void perm(int a[],int l, int r)
43 {
44     int i;
45     if(l==r)
46     {
47         for(i=1; i<=r; i++)
48             printf("%d ",a[i]);
49         printf("\n");
50     }
51     else
52     {
53         for(i=l; i<=r; i++)
54         {
55             change(&a[i],&a[l]);
56             cirr(a,l+1,i);//右移动
57             perm(a,l+1,r);
58             cirl(a,l+1,i);//左移动
59             change(&a[i],&a[l]);
60         }
61     }
62 }
63 int main()
64 {
65     int i,n;
66     scanf("%d",&n);
67     for(i=1; i<=n; i++)
68         a[i] = i;
69     perm(a,1,n);
70     return 0;
71 }

 

posted @ 2020-06-09 23:43  爱写程序的机械师  阅读(163)  评论(0)    收藏  举报