#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 110;
int input[MAX],a[MAX],output[MAX];
int n;
bool same(int a[],int b[]){
for(int i=1;i<=n;i++){
if(a[i]!=b[i]) return false;
}
return true;
}
//堆排序和插入排序
//大根堆向下调整
void adjust(int index,int n){
for(int i=index;i<=n/2;){
int k=2*i;//k暂存较大的孩子节点的下标
if(2*i+1<=n&&a[2*i]<a[2*i+1]){
k=2*i+1;
}
if(a[k]>a[i]){
swap(a[k],a[i]);
i=k;
}
else{
break;
}
}
}
bool HeapSort(){
for(int i=n/2;i>=1;i--){
adjust(i,n);
}
bool flag=false;
for(int i=n;i>=1;i--){
if(i!=n&&same(a,output)){
flag=true;
}
swap(a[i],a[1]);
adjust(1,i-1);
if(flag==true){
return true;
}
}
return false;
}
void InsertSort(){
bool flag=false;
for(int i=2;i<=n;i++){
if(i!=2&&same(output,a)){
flag=true;
}
sort(a,a+i);
if(flag==true){
return;
}
}
}
void outputa(){
for(int i=1;i<=n;i++){
if(i!=1) printf(" ");
printf("%d",a[i]);
}
}
void inputToA(){
for(int i=1;i<=n;i++){
a[i]=input[i];
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&input[i]);
}
inputToA();
for(int i=1;i<=n;i++){
scanf("%d",&output[i]);
}
if(HeapSort()){
printf("Heap Sort\n");
outputa();
}
else{
inputToA();
InsertSort();
printf("Insertion Sort\n");
outputa();
}
return 0;
}
看了晴神的题解写的
自己原本想用vector容器,这样判断相等可以直接用两个等号,不过用容器,排序操作又缺少下标。。。
因为这个数组下标范围是[1,n]闭区间,所以sort对应的数组下标是左闭右开的,因而用sort的时候要多加1,不然有一个三分测试点不通过
本题考查堆排序
个人认为:先判断,再操作一次排序,很好的切合题目要求的输出下一次排序结果