面试时遇到,忘了怎么写了,复盘之后记录一下
#include<iostream>
using namespace std;
int heap[100];//堆
int size;
int a[100]={1,2,3,4,5};//初始数组
void heapify(int now)//从上到下去维护堆(大顶or小顶)
{
int nxt=now;
if((now<<1)<=size&&heap[now]<heap[now<<1])
{
swap(heap[now<<1],heap[now]);
nxt=now<<1;
}
if((now<<1|1)<=size&&heap[now]<heap[now<<1|1])
{
swap(heap[now<<1|1],heap[now]);
nxt=now<<1|1;
}
if(nxt!=now)
{
heapify(nxt);
}
}
void insert(int num)//插入
{
heap[++size]=num;
int now=size;
//cout<<"now= "<<now<<endl;
while(now>=2&&heap[now]>heap[now/2])
{
swap(heap[now],heap[now/2]);
now/=2;
}
for(int i=1;i<=size;i++)
{
cout<<heap[i]<<" ";
}
cout<<endl;
}
int top()//返回堆顶数字
{
int ans=heap[1];
heap[1]=heap[size--];
heapify(1);
for(int i=1;i<=size;i++)
{
cout<<heap[i]<<" ";
}
cout<<endl;
return ans;
}
void init()
{
int n=size/2;
for(int i=n;i>=1;i--)
{
heapify(i);
}
}
int main()
{
size=5;
for(int i=0;i<5;i++)
{
heap[i+1]=a[i];
}
init();
while(1)
{
string ml;
int num;
cin>>ml;
if(ml=="quit") break;
if(ml=="insert") cin>>num,insert(num);
if(ml=="top")cout<<top()<<endl;
}
return 0;
}