题目就是需要区分插入排序和堆排序
插入排序就是前面是从小到大排好了,后面位置都不变
但是要注意!!!如果前后两个元素相等也是可以算排好的(测试点4)当时卡在这里卡了很久......一直以为是堆排序写错了QAQ
然后是堆排序的实现:
先将第1个元素和第 i 个元素互换(第i个元素是从后往前第一个不是排好的元素,第一个元素一定是在堆中最大的元素,将两个元素互换那1~i-1就是没排好的了。)
然后就是把第一个元素下沉,一开始写了一坨if判断,但是参考学习了柳神的判断语句,用一个j来代替要换位置的坐标就可以少进行很多重复的判断(一开始括号没对上还找问题找了很久QAQ)
以下是ac代码
#include<iostream>
using namespace std;
int n,old[105]={0},now[105]={0},flag=1;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>old[i];
for(int i=1;i<=n;i++)cin>>now[i];
int i=1;
while(i<n && now[i]<=now[i+1])i++;
for(int j=i+1;j<=n;j++) if(now[j]!=old[j])flag=0;
if(flag){
cout<<"Insertion Sort"<<endl;
sort(now+1,now+i+2);
}
else{
cout<<"Heap Sort"<<endl;
i=n;
while(i>1 && now[i]>now[1])i--;
swap(now[i],now[1]);
int pos=1;
while(pos*2<i){
int j=pos*2;
if(j+1<i && now[j+1]>now[j])j++;
if(now[j]<now[pos])break;
swap(now[j],now[pos]);
pos=j;
}
}
for(int j=1;j<=n;j++){
if(j!=1) cout<<" ";
cout<<now[j];
}
cout<<endl;
return 0;
}