• 【PAT甲级】1098 Insertion or Heap Sort (25 分)


    题意:

    输入一个正整数N(<=100),接着输入两行N个数,表示原数组和经过一定次数排序后的数组。判断是经过插入排序还是堆排序并输出再次经过该排序后的数组(数据保证答案唯一)。

    AAAAAccepted code:

     1 #define HAVE_STRUCT_TIMESPEC
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 int a[107],b[107];
     5 int c[107][5];
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     cin.tie(NULL);
     9     cout.tie(NULL);
    10     int n;
    11     cin>>n;
    12     for(int i=1;i<=n;++i)
    13         cin>>a[i];
    14     for(int i=1;i<=n;++i)
    15         cin>>b[i];
    16     int pos=0;
    17     for(int i=1;i<n;++i)
    18         if(b[i]>b[i+1]){
    19             pos=i;
    20             break;
    21         }
    22     int pos2=0;
    23     for(int i=pos+1;i<=n;++i)
    24         if(a[i]!=b[i]){
    25             pos2=i;
    26             break;
    27         }
    28     if(!pos2){
    29         cout<<"Insertion Sort
    ";
    30         int flag=0,mn=b[pos+1];
    31         int ppos=0;
    32         for(int i=1;i<=n;++i)
    33             if(b[i]>mn){
    34                 ppos=i;
    35                 break;
    36             }
    37         for(int i=pos+1;i>ppos;--i)
    38             b[i]=b[i-1];
    39         b[ppos]=mn;
    40         for(int i=1;i<=n;++i){
    41             cout<<b[i];
    42             if(i<n)
    43                 cout<<" ";
    44         }
    45     }
    46     else{
    47         cout<<"Heap Sort
    ";
    48         int ppos=0;
    49         sort(a+1,a+1+n);
    50         for(int i=n;i;--i)
    51             if(b[i]!=a[i]){
    52                 ppos=i;
    53                 break;
    54             }
    55         int mx=0,flag=0;
    56         for(int i=1;i<=ppos;++i)
    57             if(b[i]>mx){
    58                 mx=b[i];
    59                 flag=i;
    60             }
    61         swap(b[flag],b[ppos]);
    62         int s=1;
    63         while(s<ppos){
    64             if(b[s*2]>b[s]&&b[s*2+1]>b[s]&&ppos>s*2+1){
    65                 if(b[s*2]>b[s*2+1]){
    66                     swap(b[s],b[s*2]);
    67                     s=s*2;
    68                 }
    69                 else{
    70                     swap(b[s],b[s*2+1]);
    71                     s=s*2+1;
    72                 }
    73             }
    74             else if(b[s*2+1]>b[s]&&ppos>s*2+1){
    75                 swap(b[s],b[s*2+1]);
    76                 s=s*2+1;
    77             }
    78             else if(b[s*2]>b[s]&&ppos>s*2){
    79                 swap(b[s],b[s*2]);
    80                 s=s*2;
    81             }
    82             if(s*2>=ppos)
    83                 break;
    84         }
    85         for(int i=1;i<=n;++i){
    86             cout<<b[i];
    87             if(i<n)
    88                 cout<<" ";
    89         }
    90     }
    91     return 0;
    92 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    字典相关操作
    列表解析+判断语句求偶数+有序字典
    函数和作用域
    文件处理
    简单记事本逻辑
    冒泡排序
    centos7 升级openssl全过程
    sql format
    Dubbo入门前功课,spring boot 实现RPC 远程调用
    Whitelabel Error Page
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11964469.html
Copyright © 2020-2023  润新知