优先级队列------第三次修改版本
程序员文章站
2022-03-31 20:17:25
...
程序小修小补会越变越好,在认真阅读第二次版本的基础上,请比较下面这一小段代码和之前的区别。
新代码:
void FilterUp(Pointer_PQ pq, int start) //向上调整,为插入节点服务,将下标为start的节点执行“上浮”操作
{
assert(pq != NULL); //防止对空指针进行操作
assert(start >= 0); //下标合法性检查
int j = start; //child 进行遍历的时候,j是不能取到0
int i = (j - 1) / 2; //parent
Node tmp = pq->queue[j];
while (i>=0)
{
if (pq->queue[i].key < tmp.key)//parent小于child,已满足最小堆的条件
break;
pq->queue[j] = pq->queue[i]; //父节点下沉
j = i;
i = (i - 1) / 2;
}
pq->queue[j] = tmp; //下标j记录的是恰当的位置
}
死循环发生
源代码
void FilterUp(Pointer_PQ pq, int start) //向上调整,为插入节点服务,将下标为start的节点执行“上浮”操作
{
assert(pq != NULL); //防止对空指针进行操作
assert(start >= 0); //下标合法性检查
int j = start; //child 进行遍历的时候,j是不能取到0
int i = (j - 1) / 2; //parent
Node tmp = pq->queue[j];
while (j>0)
{
if (pq->queue[i].key < tmp.key)//parent小于child,已满足最小堆的条件
break;
pq->queue[j] = pq->queue[i]; //父节点下沉
j = i;
i = (i - 1) / 2;
}
pq->queue[j] = tmp; //下标j记录的是恰当的位置
}
所以源代码的while循环的条件更为合理。
上一篇: UEditor编辑器自定义上传图片或文件路径的修改方法
下一篇: 这样吃香蕉容易吃出癌症!