题目描述:编写程序判断以下给出的整数序列是否为最小堆。
输入:
第一行是元素的个数n;
第二行是n个整数序列。
输出:
如果是小根堆,输出Yes,否者输出No。
样例输入:
10
100 86 48 73 35 39 42 57 66 21
样例输出:
No
#include<iostream>
#define maxsize 100
using namespace std;
void sift(int a[],int low,int high)
{
int i=low;
int j=2*i;
int tmp=a[i];
while(j<=high)
{
if(j<high&&a[j]>a[j+1])
{
j++;
}
if(tmp>a[j])
{
a[i]=a[j];
i=j;
j=2*i;
}
else
{
break;
}
}
a[i]=tmp;
}
int main()
{
int flag=0;
int n,a[maxsize],i,b[maxsize]={0};
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
b[i]=a[i];
}
for(i=n/2;i>=1;i--)
{
sift(a,i,n);
}
for(i=1;i<n;i++)
{
if(a[i]!=b[i])
{
flag=1;
break;
}
}
if(flag==0)
{
cout<<"Yes";
}
else
{
cout<<"No";
}
return 0;
}
相对于之前的堆排序算法实际上就是用了flag标志。。。
写得比较水,勿喷。。。