题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805368847187968
思路:
判断b序列是a序列经过那种变换的得到的,就是在每次堆排序和插入排序变换时加一个判断就行了。
堆排序:https://blog.csdn.net/qq_41829060/article/details/84198068
插入排序:找到一个i位置,i位置前是从小到大排序的,找到i要插入的位置。
(注意:插入排序时是每次交换都要有i变为j,即下一次交换的是a[j]与下一个a[j`])。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void sp(int &x,int &y)
{
int tp=x;x=y;y=tp;
}
int it(int a[],int b[],int n)
{
int i,j,fg=1;
for(i=1;i<n;i++)
{
int tp=i;
for(j=i;j>=0;j--)
if(a[tp]<a[j])
{
sp(a[tp],a[j]);tp=j;
}
if(fg==0)
{
printf("Insertion Sort\n");
for(j=0;j<n-1;j++) printf("%d ",a[j]);
printf("%d\n",a[j]);
return 1;
}
fg=0;
for(j=0;j<n;j++)
if(a[j]!=b[j])
{
fg=1;break;
}
}
return 0;
}
void max_heap(int a[],int st,int ed)
{
int dad=st;
int son=dad*2+1;
while(son<=ed)
{
if(son+1<=ed&&a[son]<a[son+1]) son++;
if(a[dad]>a[son]) return ;
else
{
sp(a[dad],a[son]);
dad=son;
son=dad*2+1;
}
}
}
void heap(int a[],int b[],int n)
{
printf("Heap Sort\n");
int i,j,fg=1;
for(i=n/2-1;i>=0;i--)
{
max_heap(a,i,n-1);
if(fg==0)
{
for(j=0;j<n-1;j++) printf("%d ",a[j]);
printf("%d\n",a[j]);
return ;
}
fg=0;
for(j=0;j<n;j++)
if(a[j]!=b[j])
{
fg=1;break;
}
}
for(i=n-1;i>0;i--)
{
sp(a[0],a[i]);
max_heap(a,0,i-1);
if(fg==0)
{
for(j=0;j<n-1;j++) printf("%d ",a[j]);
printf("%d\n",a[j]);
}
fg=0;
for(j=0;j<n;j++)
if(a[j]!=b[j])
{
fg=1;break;
}
}
}
int main(void)
{
int i,n,a[120],b[120],c[120];
cin>>n;
for(i=0;i<n;i++) cin>>a[i],c[i]=a[i];
for(i=0;i<n;i++) cin>>b[i];
if(it(a,b,n)==1) return 0;
else heap(c,b,n);
return 0;
}