先判断是否为插入排序,不是的话找出堆排序进行到第几次,然后再来一次。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n;
scanf("%d", &n);
vector<int> arr(n), part(n);
for(int i = 0; i < n; ++i){
scanf("%d", &arr[i]);
}
for(int i = 0; i < n; ++i){
scanf("%d", &part[i]);
}
int idx = 0;
for(int i = 1; i < n; ++i){
if(part[i] < part[i-1]){
idx = i;
break;
}
}
bool same = true;
for(int i = idx; i < n; ++i){
if(arr[i] != part[i]){
same = false;
break;
}
}
if(same){
printf("Insertion Sort\n");
sort(begin(part), begin(part)+idx+1);
for(int i = 0; i < n; ++i){
if(i) printf(" ");
printf("%d", part[i]);
}
}else{
printf("Heap Sort\n");
make_heap(begin(arr), end(arr));
int cnt = 1;
while(arr != part){
swap(arr[0], arr[n-cnt]);
make_heap(begin(arr), begin(arr)+n-cnt);
cnt++;
}
swap(arr[0], arr[n-cnt]);
make_heap(begin(arr), begin(arr)+n-cnt);
for(int i = 0; i < n; ++i){
if(i) printf(" ");
printf("%d", arr[i]);
}
}
return 0;
}