本题一开始最后一个测试点没通过
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000100;
int n,sie,in[maxn],tar[maxn];
void heapfy(int sie,int num){
int t=num;
if(num*2<=sie && tar[2*num]>tar[t])
t=2*num;
if(num*2+1<=sie && tar[2*num+1]>tar[t]) //之前这里都是>tar[num],导致最后一个测试点不通过。
t=2*num+1;
if(num!=t){
swap(tar[num],tar[t]);
heapfy(sie,t);
}
}
int main(){
cin>>n;
sie=n;
for(int i=1;i<=n;i++) cin>>in[i];
for(int i=1;i<=n;i++) cin>>tar[i];
int p=2;
while(p<=n && tar[p-1]<=tar[p]) p++;
int div=p;
while(p<=n && tar[p]==in[p]) p++;
if(p==n+1){
printf("Insertion Sort\n"); //插入排序特点: 已经排好+一样的=全部
sort(tar+1,tar+div+1);
}
else{
printf("Heap Sort\n");
while(sie>2 && tar[sie]>=tar[1]) sie--; //我们要进行此时的下一步堆排序,那么就找出第一个比堆顶元素小的换上去。
swap(tar[1],tar[sie]);
sie--; //换上去之后,这个数排好了,所以不能把这个数也算入维护范围,故sie--;
heapfy(sie,1);
}
for(int i=1;i<=n;i++){
if(i!=1)
printf(" ");
printf("%d",tar[i]);
}
return 0;
}