PAT甲级1098 Insertion or Heap Sort 模拟插入和堆排序
作者:互联网
代码如下:
//模拟插入排序和堆排序
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
vector<int>init;//初始的数组
vector<int>goal;//当前的数组
vector<int>cur;//当前变化中的数组
void max_heapify(int i,int h){
int l,r,largest;
l=2*i+1;
r=2*i+2;
if(l<=h&&init[l]>init[i]){
largest=l;
}else{
largest=i;
}
if(r<=h&&init[r]>init[largest]){
largest=r;
}
if(largest!=i){
swap(init[i],init[largest]);
max_heapify(largest,h);
}
}
int main(){
cin>>n;
init.resize(n);
goal.resize(n);
cur.resize(n);
for(int i=0;i<n;i++){
cin>>init[i];
cur[i]=init[i];
}
for(int i=0;i<n;i++){
cin>>goal[i];
}
bool flag=false;
for(int i=0;i<n;i++){
sort(cur.begin(),cur.begin()+i+1);
if(cur==goal){//若满足插入排序
flag=true;
}
}
if(flag){
int pos=n-1;
int cur_num=goal[0];//当前数字
for(int i=0;i<n;i++){
if(goal[i]<cur_num){
pos=i;
break;
}
cur_num=goal[i];
}
sort(goal.begin(),goal.begin()+pos+1);
cout<<"Insertion Sort"<<endl;
for(int i=0;i<n;i++){
if(i!=n-1){
cout<<goal[i]<<" ";
}else{
cout<<goal[i];
}
}
}else{
for(int i=n/2-1;i>=0;i--){
max_heapify(i,n-1);
}
bool flag1=false;
for(int i=n-1;i>=1;i--){
swap(init[0],init[i]);
for(int j=i/2-1;j>=0;j--){
max_heapify(j,i-1);
}
if(flag1==true){
cout<<"Heap Sort"<<endl;
for(int j=0;j<n;j++){
if(j!=n-1){
cout<<init[j]<<" ";
}else{
cout<<init[j];
}
}
break;
}
if(init==goal){
flag1=true;
}
}
}
return 0;
}
标签:Sort,PAT,int,max,heapify,init,Insertion,largest,include 来源: https://blog.csdn.net/weixin_44123362/article/details/100835535