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 ",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 ",sum); 35 else 36 printf("%d ",sum-2); 37 return 0; 38 }