基础实验7-2.2 插入排序还是堆排序 (25 分)
这题插入排序大家应该很好理解,就是堆排序可能不熟悉。根据这题的要求,是先进行堆排序建立个大根堆,然后每次取出最大值放在末尾,每次更新堆。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int a[200],b[200],t[200];
int f1=0,f2=0,n;
void sort1() //插入排序
{
for(int i=1;i<n;++i)
{
int x=a[i];
int j=i-1;
while(j>=0&&a[j]>x)
{
a[j+1]=a[j];
j--;
}
a[j+1]=x;
if(f1){
for(j=0;j<n;++j)
{
if(j==0)
cout<<a[j];
else
cout<<" "<<a[j];
}
break;
}
int k;
for(k=0;k<n;++k)
if(a[k]!=t[k])
break;
if(k==n){
cout<<"Insertion Sort"<<endl;
f1=1;
}
}
}
void sort5(int u,int size) //堆排序
{
int t=u;
if(u*2<=size&&b[t]<b[u*2])
t=u*2;
if(u*2+1<=size&&b[t]<b[u*2+1])
t=u*2+1;
if(u!=t)
{
swap(b[u],b[t]);
sort5(t,size);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;++i)
{
cin>>a[i];
b[i+1]=a[i];
}
for(int i=0;i<n;++i)
cin>>t[i];
//插入排序判断
sort1();
//堆排序判断,根据样例先排序,每次取出最大放末尾,再进行判断
for(int i=n/2;i>0;--i)
sort5(i,n);
int size=n;
for(int i=0;i<n;++i)
{
swap(b[1],b[size]);
size--;
sort5(1,size);
if(f2){
for(int j=1;j<=n;++j)
{
if(j==1)
cout<<b[j];
else
cout<<" "<<b[j];
}
break;
}
int j;
for(j=0;j<n;++j)
if(b[j+1]!=t[j])
break;
if(j==n){
cout<<"Heap Sort"<<endl;
f2=1;
}
}
}