zoukankan      html  css  js  c++  java
  • 表排序

    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 } 
  • 相关阅读:
    c#中的构造方法
    c# Dictionary拓展2个key得到1个value
    虚拟主机的提权两个小技巧
    teamviewer提权
    域渗透:mstsc连接记录清理
    linux之 vim 常用命令
    Linux之 find 命令学习
    域渗透:MS14-068
    学习:脱壳之Anti Dump和修复PE
    学习:KiUserExceptionDispatcher之寻找OEP
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/12742516.html
Copyright © 2011-2022 走看看