堆排序
-
建堆
for(int i=n/2;i;i–) down(i); -
向下调整
void down(int u)
{
int t=u;
if(u*2<=cnt&&h[u*2]<h[t]) t=u*2;
if(u*2+1<=cnt&&h[u*2+1]<h[t]) t=u*2+1;
if(t!=u)
{
swap(h[u],h[t]);
down(t);
}
}
3.排序
int cnt=n;
for(1~n)
{
swap(h[1],h[cnt–]);
down(1);
}
- 判断大根还是小根
bool min=1,max=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<2;j++)
{
if(i*2+j<=n)
if(h[i*2+j]>h[i]) min=1;
else max=1;
}
}
if(min&&max) puts("Not Heap");
else if(min) puts("Min Heap");
else puts("Max Heap");