表排序

Posted on 2020-04-21 09:45  金色的省略号  阅读(168)  评论(0编辑  收藏  举报

N个数字的排列,由若干个独立的环构成,判断环的结束条件是,if(table[i] == i);

 1 /* PTA  Sort with Swap */
 2 #include <stdio.h>
 3 #define N 100001
 4 int main()
 5 {
 6     int n,sum=0;
 7     int a[N],b[N];
 8     scanf("%d", &n);
 9     for(int i=0; i<n; ++i)
10     {
11         scanf("%d",&a[i]);
12         b[i] = 0;
13     }
14     for(int i=0; i<n; ++i) /* n个数字 */
15     {/* 只有一个数字的独立环不需要交换 */
16         /* 需要交换的环且没有交换过 */
17         if(a[i]!=i && !b[i]) 
18         {            
19             int j=i;    /* 记录环的开始位置 */
20             int count=0; /* 记录交换次数 */
21             do{
22                 count++;   /* 环内元素++ */
23                 b[j] = 1;  /* 元素已经记录 */                
24                 if(!a[j]){ /* 如遇到0,减去入出环2次 */
25                     count-=2;
26                 }                     
27                 j = a[j]; /* 环内下一个元素下标更新 */
28             }while(j!=i); /* 环是否结束 */
29             count++; /* 因为减去了0, 交换次数当前数+1 */
30             sum += count;  /* 累加环内交换次数 */
31         }
32     }
33     printf("%d\n",sum);
34     return 0;
35 } 
 1 /* PTA  Sort with Swap */
 2 #include <stdio.h>
 3 #define N 100001
 4 
 5 int main()
 6 {
 7     int n;
 8     int a[N],b[N];
 9     scanf("%d", &n);
10     for(int i=0; i<n; ++i)
11     {
12         scanf("%d",&a[i]);
13         b[i] = 0;
14     }
15     int sum = 0;
16     for(int i=0; i<n; ++i) 
17     {
18         if(!b[i] && a[i] != i)
19         {            
20             int len = 2;
21             int j = a[i];
22             while(a[j] != i)
23             {    
24                 b[j] = 1;
25                 len++;
26                 j = a[j];                                
27             }                
28             b[j] = 1;
29             len++;
30             sum += len;    
31         }        
32     }    
33     if(a[0] == 0) 
34         printf("%d\n",sum);
35     else
36         printf("%d\n",sum-2);
37     return 0;
38 }