【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\n";
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\n";
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 }

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11964469.html