欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

优先级队列------第三次修改版本

程序员文章站 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循环的条件更为合理。 

相关标签: 优先级队列