考查点:堆排序,插入排序
思路:用插入排序判断,直接用sort方法
提交情况:这里由于调用insert函数过程中heap已经改变所以在堆排序时必须复原heap,还有用vector必须从1开始所以初始时应该加入元素
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i >= y; i--)
#define MAXN 1010
#define oo 0x3f3f3f3f
using namespace std;
vector<int>heap,orign,change;
int n;
void downAdjust(int low,int high)
{
int i=low,j=i*2;
while(j<=high){
if(j+1<=high&&heap[j]<heap[j+1]){
j++;
}
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j;
j=i*2;
}else{
break;
}
}
}
bool insertSort()
{
bool flag=false;
FOR(i,2,n+1){
if(i!=2&&heap==change){
flag=true;
}
sort(heap.begin()+1,heap.begin()+i+1);
if(flag==true) return true;
}
return false;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int x;
scanf("%d",&n);
orign.push_back(-1);
change.push_back(-1);
FOR(i,0,n)
{
scanf("%d",&x);
orign.push_back(x);
}
FOR(i,0,n){
scanf("%d",&x);
change.push_back(x);
}
heap=orign;
if(insertSort()){
printf("Insertion Sort\n");
FOR(i,0,n)
{
printf("%d",heap[i+1]);
if(i!=n-1)printf(" ");
}
}else{
printf("Heap Sort\n");
heap=orign;
rFOR(i,n/2,1)
{
downAdjust(i,n);
}
bool flag=false;
int pos;
rFOR(i,n,2)
{
if(i!=n&&change==heap)flag=true;
swap(heap[i],heap[1]);
downAdjust(1,i-1);
if(flag){
FOR(i,0,n)
{
printf("%d",heap[i+1]);
if(i!=n-1)printf(" ");
}
break;
}
}
}
return 0;
}