题意: 给出n和n个数的序列a和b,a为原始序列,b为排序其中的一个步骤,问b是a经过了堆排序还是插入排序的,并且输出它的下一步
tip:模拟 + 最大堆
#include<iostream>
#include<algorithm>
using namespace std;
int b[103];
void adjust(int l,int r) {
int i=l;
int j=2*l+1;
while(j<=r) {
if(j+1<=r&&b[j+1]>b[j])//与右兄弟比较
j++;
if(b[i]>=b[j])//与根结点比较
break;
swap(b[i],b[j]);
i=j;//循序渐进下一个结点
j=2*i+1;
}
}
int main() {
int n;
cin>>n;
int a[n];
for(int i=0; i<n; ++i)
cin>>a[i];
for(int i=0; i<n; ++i)
cin>>b[i];
int t=1;
while(t<n&&b[t-1]<=b[t])
++t;
int index=t;
while(t<n&&a[t]==b[t])
++t;
if(t==n) {//插入排序特点:前index个有序,后面与原序列一致
printf("Insertion Sort\n");
sort(b,b+index+1);
} else {
printf("Heap Sort\n");
t=n-1;
while(t>1&&b[t]>=b[0])
--t;//找到第一个比b[0]小的值
swap(b[t],b[0]);
adjust(0,t-1);//向下调整
}
cout<<b[0];
for(int i=1; i<n; ++i)
cout<<" "<<b[i];
return 0;
}