我反正写的挺痛苦的,又要判断哪种排序,又要搞堆排序。逐个击破就好。
判断依据我想的是从后往前看,不相等则为堆排序,相等且不是最大数为插入排序,相等且为最大数再往前看,依次类推。
代码没有打磨过,怎么想就怎么写了,有些地方写的有点复杂。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> I1,I2;
vector<int> result;
int Heap[101];
int Heap2[101];
void hs(int index,int max){
if(index>max) return;
if(Heap[2*index]>Heap[2*index+1]){
if(Heap[2*index]>Heap[index]){
swap(Heap[2*index],Heap[index]);
}
}else{
if(Heap[2*index+1]>Heap[index]){
swap(Heap[2*index+1],Heap[index]);
}
}
hs(2*index,max);
hs(2*index+1,max);
}
int panduan(int x){
if(I1[x]!=I2[x]){
return 2;
}else if(I2[x]!=result[x]){
return 1;
}else{
return panduan(x-1);
}
}
int main(){
int N;
cin>>N;
I1.resize(N);
I2.resize(N);
result.resize(N);
for(int i=0;i<N;i++){
scanf("%d",&I1[i]);
}
for(int i=0;i<N;i++){
scanf("%d",&I2[i]);
}
result=I1;
sort(result.begin(),result.end());
int ans1=panduan(N-1);
if(ans1==1){
printf("Insertion Sort\n");
int left_max=I2[0];
int tag=-1;
for(int i=1;i<N;i++){
if(I2[i]<left_max){
tag=i;
break;
}else{
left_max=I2[i];
}
}
sort(I2.begin(),I2.begin()+tag+1);
for(auto it=I2.begin();it!=I2.end();it++){
if(it==I2.begin()){
printf("%d",*it);
}else{
printf(" %d",*it);
}
}
}else{
printf("Heap Sort\n");
for(int i=1;i<=N;i++){
Heap[i]=I2[i-1];
}
int max=-1;
for(int i=N;i>0;i--){
if(Heap[i]<Heap[1]){
max=i;
break;
}else{
Heap2[i]=Heap[i];
Heap[i]=-1;
}
}
swap(Heap[1],Heap[max]);
Heap2[max]=Heap[max];
Heap[max]=-1;
hs(1,max-1);
for(int i=1;i<=N;i++){
if(i==1){
printf("%d",Heap[i]);
}else if(i<max){
printf(" %d",Heap[i]);
}else{
printf(" %d",Heap2[i]);
}
}
}
return 0;
}