求问这两个循环用的是什么算法解决办法

求问这两个循环用的是什么算法

while((head * 2) <= last)
{ // shift down
int child = head * 2;
if((child + 1) <= last && open[child + 1]->getf() < open[child]->getf())
child++;
if(open[head]->getf() <= open[child]->getf())
break;

AstarItem* temp = open[child];
open[child] = open[head];
open[head]  = temp;

head = child;
}


while(last > 1)
{
int half = last / 2;
if(open[half]->getf() <= open[last]->getf())
{
break;
}
AstarItem* temp = open[last];
open[last] = open[half];
open[half] = temp;

last = half;
}


排序的感觉.又感觉排不全。求算法名就行,我自己去找详细的。。。。。
算法

------解决方案--------------------
第一个是最小堆
------解决方案--------------------
两个都是堆啊,一个是下沉一个是上浮。