题意:
输入一个正整数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 }
原文地址:https://www.cnblogs.com/ldudxy/p/11964469.html
时间: 2024-10-04 04:34:54