题目

题意: 给出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;
}